2020-07-14 にっき
自分はアヒルのように動けばアヒル、Arrayを拡張して回転寿司のように動くArrayは回転寿司、そういう雑な気持ちでRefinementsを使っているんだなあ。べんりなので...。
これは雑すぎですがこういう感じ
Refinementsたぶん今だけ男みたいな気持ちと相性よさそう
— はなちん (@hanachin_) 2020年7月14日
「こうでもかけるんだけど〜」とクラスを定義しだすと「クラスでいいじゃん」になるかと思いますがクラスを定義しなくていいというのが便利ポイントなのでその辺の音楽性の違いっぽい。 あとは同じことをやるならメソッドにしなくてもよくて結果を説明的な名前の変数名に入れればいいのでは、とかもありそうだけど、それもやはりすごく特定のユースケースに合わせたメソッドをその場だけで使うことが出来る、というところに価値を見出しているんですよね。 一般的なメソッドを組み合わせて呼びたいわけじゃなくて特定のユースケースに合わせて作ったメソッドが生えているのがよい。 そういう意味でいうと自分はやはり語彙を再定義しているRSpecみたいなところをRubyの書きはじめの最初にガツンとうけてしまったので文化的な背景がやはり違いそう。
色々と話していてrefine(Array)
よりも refine(sushi.singleton_class)
のほうがより範囲が狭くなって Module.new
との相性がよいことに気がついた。
これの感想にリプ返していた
雑ではない仲間
rake タスクを refinements でなんかきれいにやりたいやつは普通にクラス定義してそっちに渡せばいいのでは……
— はくどー (@HKDnet) 2020年7月14日
そうなりますよね(テストできるし)
— はなちん (@hanachin_) 2020年7月14日
一時的にしか使わないタスクを未来永劫メンテし続けたくはなく、そういう終わったクラスをどうマネージするかみたいな問題があると思うんですが、それを解決できるかもって一瞬思ったけどやっぱテストしにくいし微妙かと思いました
— はくどー (@HKDnet) 2020年7月14日
雑仲間
https://t.co/ulkFjgBv2O
— Tsuyoshi Hoshino (@hoppiestar) 2020年7月14日
> rakeタスク中の処理を読みやすくメソッドにわけたいときもRefinementsは便利
これ! これ以外は なんとかなってしまう人生だった気がする
絶妙な雑さのときに便利なんですよね
— はなちん (@hanachin_) 2020年7月14日
名前つけたくないときとか
わりと書捨てに近いときとか
アプリケーションの中でライブラリみたいなことをやるときに補助的なAPIを完全にprivateなものとしてはやせるのはやはり便利そう
アプリケーション側だと『その場でのみ呼び出せるメソッド』を定義する時に使うなーより厳密な private メソッドを定義する場合とか / Refinementsの用法用量わからない日記 - hanachin temporary - https://t.co/H0oyDzyTDs
— バンビちゃん@実際クソザコメンタル (@pink_bangbi) 2020年7月14日
よく使うのが module を定義する場合に『その module 内でしか使わないメソッド』を Refinements として定義する。普通は private メソッドにすることが多いと思うけど private メソッドは外からも呼び出せてしまうので危険
— バンビちゃん@実際クソザコメンタル (@pink_bangbi) 2020年7月14日
こういう感じ
— バンビちゃん@実際クソザコメンタル (@pink_bangbi) 2020年7月14日
module M
using Module\.new {
refine M do
# M 内でのみ呼び出したい
def bar
"refinem M#bar"
end
end
}
def foo
# OK
bar
end
end
class X
include M
def hoge
# OK
foo
# NG
bar
end
end
これの何が便利かっていうと通常 module は『mixin された側でどういうメソッドが必要なのか』を考えて書く必要がある。
— バンビちゃん@実際クソザコメンタル (@pink_bangbi) 2020年7月14日
なので雑にメソッドなどを生やす事がむずかしい
けど、Refinements を使うと本当の意味で「M でしか参照できない」メソッドを定義することができるので雑にメソッドが定義できる
このような事がこの記事に書いてあるぞ! / 【Ruby Advent Calendar 2018】あなたのしらない Refinements の世界【3日目】 - Secret Garden(Instrumental) - https://t.co/vhKChdJxWd
— バンビちゃん@実際クソザコメンタル (@pink_bangbi) 2020年7月14日
補助的なメソッドを衝突気にせずバンバンかけるの便利そう
— はなちん (@hanachin_) 2020年7月14日
モジュール関数を使えば Benri.hoge(obj, a, b) みたいに書くこともできますが、Refinements だと obj.hoge(a, b) みたいによりオブジェクト指向っぽくかけるので便利ですねー
— バンビちゃん@実際クソザコメンタル (@pink_bangbi) 2020年7月14日
これもそうかな
Refinementsの用法でふと思ったけど、concerns のモジュール内でApplicationRecordやApplicationControllerを拡張するのは便利かも?privateメソッドでメソッド名の衝突を気にしなくて済むかも。
— 神速 (@sinsoku_listy) 2020年7月14日
いい話!なので特にリプをしていなかった
アプリケーションコードでrefinementsを使うことが全然ない
— Pocke(ぽっけ) (@p_ck_) 2020年7月14日
雑仲間だ
使い捨てメソッドを Refinements を定義することはよくある
— バンビちゃん@実際クソザコメンタル (@pink_bangbi) 2020年7月14日
なんでなんだろうなあ
Refinementsはそれを使うのが目的化しやすいような?
— カルパス🦜 (@yoshi_hirano) 2020年7月14日
他の言語にはない機能なのでなくてもだいたいのことは書けるんだけど、みんな実際使っていったら気に入ったりブロックの中だけでRefinementsを有効にしたりしたくなると思うんですよね、便利なので。
— はなちん (@hanachin_) 2020年7月15日
便利というのは使わないとわからないので使うことを目的にはじめるのもよいんじゃないかな派です。
いいと思います。アプリケーションコードの文脈だと他のアプローチを提案しそうですが。
— カルパス🦜 (@yoshi_hirano) 2020年7月15日
わ、わかるが...!w
— はなちん (@hanachin_) 2020年7月15日
アプリケーションコードだとなんでそうなってしまうのかわからないのがわかる(言語化できていない)
この辺を読み直しているけど使ってみるとやっぱり削がれてしまった機能をもとめてブロック単位のRefinementsとかを作り出してしまうので使い勝手がよくないだけなんだろうか
magazine.rubyist.net rubykaigi.org github.com
組み込みを拡張したいとなるとそうですよね、という感じ
標準ライブラリを拡張するときだけ使ってる / 1件のコメント https://t.co/7iSPYgSQna “Refinementsの用法用量わからない日記 - hanachin temporary” https://t.co/jWJhJf3F7C
— 神速 (@sinsoku_listy) 2020年7月14日
それRefinementsじゃなくても出来るよ、みたいな感じになりません? (ならない場面だけで使う?)
— はなちん (@hanachin_) 2020年7月14日
StringやArrayなどを拡張するときしか私はRefinementsを使っていないですね...。他はprependで事足りることが多いです。
— 神速 (@sinsoku_listy) 2020年7月14日
はい
人生で唯一真面目に書いたRefinements、1.secondをactivesupportなしでやるやつだけだわ
— wata (@wata727_) 2020年7月14日
activesupportを依存に追加すると死ぬ病
— wata (@wata727_) 2020年7月14日
— wata (@wata727_) 2020年7月14日