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番目のスタイルの長所:
=~
メソッドの結果とそのブール値の解釈の間の関係が何であるかは、より明白です。- より創造的な明示的なキャストを自由に使用できるようになります
慣用的な場合 (たとえば、 を使用した正規表現マッチング=~
) には暗黙的な型変換を残し、そうでない場合 (たとえば、独自のプロパティ、特に複数の戻り値の型がある場合) には明示的に行う中間点があるのではないかと思います。 )。
コミュニティがこの問題について共有できる洞察や経験をいただければ幸いです。