質問
word
という文字列と infinitive
という関数があり、
word.infinitive
は、場合によっては別の文字列を返し、そうでない場合は空の文字列を返します
以下のコードスニペットのエレガントなルビー1行式を見つけようとしています
if word.infinitive == ""
return word
else return word.infinitive
不定詞が""の代わりにnilを返したため、次のようなことができたはずです
(word.infinitive or word)
しかし、そうではないので、短絡ORを利用することはできません
理想的には
1)他のコードに簡単に埋め込むことができる単一の式
2)関数不定詞が1回だけ呼び出される
3)カスタムgemやプラグインをコードに追加しない
解決
モンキーパッチと不正使用の構文を恥じていない場合、これは動作します:
class String
def | x
if empty? then x else self end
end
end
その後、 word.infinitiveと言うことができます|単語
、私に尋ねると実際にかなり自然にスキャンします。
ただし、より良いアイデアは、不定詞メソッドを変更するか、単語を変更せずに返すバージョンを追加することだと思います。
編集:より洗練されたソリューションを次に示します。
[word.infinitive, word].find {|x| not x.empty?}
他のヒント
ActiveSupport presence
メソッドは空(または blank?
)文字列を nil
にします。正確なユースケース向けに設計されています:
word.infinitive.presence || word
レールの外でActiveSupportを簡単に使用できることに注意してください:
require 'active_support/core_ext/object/blank'
(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil
正しいことをする-空白文字列の代わりにnilsを返すように不定詞を修正するか、実際に触れることができない場合は独自のインターフェイスでラップします。
String#empty?
(boolean?true-val:false-val)
を使用できます
return word.infinitive.empty? ? word : word.infinitive
不定詞を1回だけ呼び出したい場合:
return (inf = word.infinitive).empty? ? word : inf
コードにメモを追加することを検討することもできます。
または、構文を乱用することなく、新しい関数を文字列にモンキーパッチできます。
class String
def squash
self.empty? ? nil : self
end
end
今できること
puts var.squash or "default text"
私は英語を母国語としないので、 squash が最高の言葉かどうかわかりません。 「空の場合のみnilにする」という考えを伝えるのに適した言葉はありますか?