0

String#=~関数を例にとってみましょう。一致が見つかった場合、最初の一致のインデックスを返します。これはFixnum、ブール値環境では常に true として機能します。一致が見つからない場合は、false として機能する null を返します。

今、クラスがあるとします:

class A
  attr_accessor :myprop

  # prints "I am awesome" if #myprop matches /awesome/
  # and "I am not awesome" otherwise
  def report_on_awesomeness!
    puts "I am #{myprop =~ /awesome/ ? 'awesome' : 'not awesome'}."
  end
end

このコードはほとんど期待どおりに機能しますが、試行条件演算子の最初の要素が私の質問の対象です。

ラップしないほうがいいのmyprop =~ /awesome/?私はそれを別のメソッドのように抽象化することについて話しているdef is_awesome?; myprop =~ /awesome/; endのではなく、Ruby が Fixnums を true に暗黙的にキャストし、nil を false にキャストすることを強制する現在の規則が、条件を自分でキャストしたものにラップするよりも好ましいかどうか. 私はこれを簡単に行うことができます:

class A
  attr_accessor :myprop

  # prints "I am awesome" if #myprop matches /awesome/
  # and "I am not awesome" otherwise
  def report_on_awesomeness!
    puts "I am #{(myprop =~ /awesome/).nil? ? 'not awesome' : 'awesome'}."
  end
end

私が最初のスタイルで見た長所:

  • ほとんどのメンテナー (将来の私を含む) は暗黙の型に慣れています
  • 短いです

2番目のスタイルの長所:

  • =~メソッドの結果とそのブール値の解釈の間の関係が何であるかは、より明白です。
  • より創造的な明示的なキャストを自由に使用できるようになります

慣用的な場合 (たとえば、 を使用した正規表現マッチング=~) には暗黙的な型変換を残し、そうでない場合 (たとえば、独自のプロパティ、特に複数の戻り値の型がある場合) には明示的に行う中間点があるのではないかと思います。 )。

コミュニティがこの問題について共有できる洞察や経験をいただければ幸いです。

4

1 に答える 1

0

個人的な選択です。どんなスタイルでもいいです。

true?ブール値を取得するために onを定義したらObject(別の名前である可能性がありますto_bool):

class Object
  def true?
    !!self
  end
end

しかし、ダブル バン (!!)は何でもブール値に変換するのがより簡単で、私はそれを使用することを好みますが、どこでも使用できるわけではありません。明示的にブール値が必要な場合にのみ使用します(この質問の場合は使用しません)。

ところで、false.nil? == false; 混乱を招く可能性があります。

于 2011-09-12T12:02:47.000 に答える