質問

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にする」という考えを伝えるのに適した言葉はありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top