Sidekiqライブラリのメソッドの1つ 。 スマイリーの説明
send in Rubyはオブジェクトメソッドを名前で呼び出します。 使用方法は次のとおりです。
# : . , . user.name = "" user.age = 29 # : . . def set(field, value) send("#{field}=", value) end user.set(:name, "") user.set(:age, 29)
そして、おそらく次の行を見ました:
after_create :send_email
はい、内部のレールのコールバックもsendを使用して実装されます 。
テスト中に送信しても、プライベートメソッドが呼び出されます。 RubyでのPractical Object-Oriented Designの著者(10:58のプライベートメソッドについて)のSandi Metzが、それらをまったくテストすべきかどうかについて語っています。
彼女は、プライベートメソッドのテストは不要だと考えています。パブリックメソッドをテストするときの入力データの正しいセットは、100%のカバレッジを提供します。 しかし、定期的に、不安定なコードを積極的に開発している間、Sandiはトレースを掘り下げないようにこのルールを破り、発生した場所でエラーをキャッチします。 彼女はそのようなテストを一時的なものと見なし、コードが安定するとすぐに削除します。 彼女は、「プライベートメソッドをテストする必要がある場合は、別のクラスに配置する」というアプローチを知っていますが、そのような割り当てからコードがより安定することはないと考えています。
時々あなたは送信せずに行うことはできません:
data_point = OpenStruct.new(:queued? => true) data_point.queued? # -> true data_point.send("queued?=",false) # data_point.queued? # -> false
これはOpenStructドキュメントの例です。 これは非常に手間のかかる例ですが、見知らぬ人の名前もあります。投稿の冒頭の写真から少なくとも同じ方法を使用してください。
珍しいメソッド名のトピックを続ける
多くの場合、irbチームから脱出しようとしていますか? ~/.irbrc
次のコードを追加するだけ~/.irbrc
:
module Kernel def exit end end
この記事の例を検討しているときに、それは私に起こりました。 テスト自体のために.irbrcに追加されました-動作します。 削除するつもりだったので、「でも便利ですが」と思いました。 残っている間、それは一週間横になってみましょう。
module Kernel def method_missing(method_name, *arguments, &block) return(super) unless contains_russian_letters?(method_name.to_s) possible_meaning = translit(method_name.to_s) send(possible_meaning, *arguments) end private def translit(string) string.chars.map do |char| russian_to_english_mapping[char] || char end.join end def contains_russian_letters?(string) !(string.chars & russian_symbols).empty? end def russian_symbols "".chars end def russian_to_english_mapping english = "qwertyuiop[]asdfghjkl;'zxcvbnm,.".chars russian_symbols.zip(english).to_h end end # : puts(1.inspect) # 1 (1.) # . !
あえてしなかったままにしておきます。
短所
sendの不正確な使用は、読みやすさに影響します。 比較する:
# 1. , if params[:sort_by] == "age" users.sort_by_age else users.sort_by_name end # 2. , ( ) sorting_method = "sort_by_#{params[:sort_by]}" users.send(sorting_method) # , # , : users.sort_by(params[:sort_by])
まとめると
必要な場合は、 送信を使用します 。
- 実行時にメソッドの名前を決定します。
- バイクのコールバックを作成するには;
- テストでプライベートメソッドを呼び出します。
不必要にsendを使用しないでください。