絶望から娯楽まで、便宜のために送信を使用する



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を使用しないでください。








All Articles