24

呼び出された文字列とそのようなword関数が呼び出され、場合によっては別の文字列を返し、空の文字列を返します。それ以外の場合 は、以下のコードスニペットのエレガントなルビーの1行の式を見つけようとしています infinitive
word.infinitive

if word.infinitive == ""
      return word
else return word.infinitive

不定詞が "" ではなく nil を返した場合、次のようなことができたはずです

(word.infinitive or word)

しかし、そうではないので、ショートサーキット OR を利用することはできません。
理想的には
、1) 他のコードに簡単に埋め込むことができる単一の式が必要です
。2) 関数不定詞は 1 回だけ呼び出されます
。3) 何も追加しません。コードへのカスタム宝石またはプラグイン

4

6 に答える 6

126

ActiveSupportpresenceメソッドは、空の(またはblank?)文字列をに変換しnilます。それはあなたの正確なユースケースのために設計されています:

word.infinitive.presence || word

レールの外側でActiveSupportを簡単に使用できることに注意してください。

require 'active_support/core_ext/object/blank'
于 2011-03-24T22:47:42.047 に答える
11

この記事が示唆するような正規表現を使用できます

(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil
于 2010-06-07T14:40:55.480 に答える
7

モンキーパッチや構文の悪用を恥じていない場合は、次のようにするとうまくいきます。

class String
  def | x
    if empty? then x else self end
  end
end

word.infinitive | wordあなたが私に尋ねれば、実際にはかなり自然にスキャンすると言うことができます。

ただし、不定詞メソッドを変更するか、単語を変更せずに返すバージョンを追加することをお勧めします。

編集:これはおそらくよりエレガントなソリューションです:

[word.infinitive, word].find {|x| not x.empty?}
于 2009-03-15T06:28:24.423 に答える
6

正しいことをしてください-空白の文字列の代わりに不定詞を返すように不定詞を修正するか、本当に触れることができない場合は独自のインターフェイスでラップしてください。

于 2009-03-15T09:10:32.550 に答える
5

または、構文を悪用することなく、新しい関数を String にモンキーパッチできます。

class String
  def squash
    self.empty? ? nil : self
  end
end

今、あなたはすることができます

puts var.squash or "default text"

私は英語のネイティブ スピーカーではないので、スカッシュが最適な言葉かどうかはわかりません。「空の場合のみ nil になる」という考えをより適切に伝える言葉はありますか?

于 2010-05-25T21:27:41.063 に答える
4

三項演算子(boolean ? true-val : false-val)を次のように使用できますString#empty?

return word.infinitive.empty? ? word : word.infinitive

不定詞を一度だけ呼び出したい場合:

return (inf = word.infinitive).empty? ? word : inf

コードにメモ化を追加することも検討してください。

于 2009-03-15T06:23:23.217 に答える