2011-12-30 9 views
3

の末尾にチェーンの先頭に条件を持っており、残りの部分を共有することは簡単です:条件真ん中にまたはチェーン

if condition 
    get_this 
else 
    get_that 
end 
.foo.bar.baz 

しかし、多くの場合、私は途中で条件をしたいですか、鎖の尾に私はinstance_evalを使用していると考えることができる最高は:

foo.bar 
.instance_eval{ 
    if condition 
     get_this 
    else 
     get_that 
    end 
} 
.baz 

しかし、私はinstance_evalを呼び出すと重くなるという懸念を持っているので、私は実際にそれをやっていない終わります。そうする価値がありますか?より良い方法はありますか、私はただ単純に書く必要があります。

if condition 
    foo.bar.get_this 
else 
    foo.bar.get_that 
end 
.baz 
+0

+1は最初のスニペットの構文です。 –

+0

@AndrewGrimmコメントをいただきありがとうございますが、「最初のスニペット」はどういう意味ですか? – sawa

+0

スニペットは小さなコードです。私は 'if条件... .foo.bar.baz'を参照しています。 [ウィクショナリー](http://en.wiktionary.org/wiki/snippet)によると、「切り捨て」の断片をスニペットで表示します。 「スナップ」自体はおそらくオノマトペであり、日本語ではチョッキチョッキです。 –

答えて

3

なぜブール値と番目を受け入れるbarのメソッドを提供しませんenはそれに応じて行動する?これはロジックをカプセル化し、複雑なロジックや複数の条件を隠すこともできます。

class Bar 
    def get_what(condition) 
    case condition 
     when qux; get_this(param1) 
     when quux; get_that(param1, param2) 
     else get_other(param1) 
    end 
    end 
end 

# assuming `bar` is an instance of `Bar` 
foo.bar.get_what(cond).baz 

PS:Rubyでハッシュや配列を扱う場合ただし、(Law of Demeter (Wikipedia)によると、これは悪い習慣:)と考えられるかもしれないので)私は、多くの場合、過度に長いメッセージチェーンのようなものを回避しようとユースケースに応じて、それは有用なのです。したがって、長いメッセージチェーンを使用するための有効なユースケースがあると思います。

3

どのように条件付きでメソッドを呼び出すためにObject#sendの使用に関する:複数/異なるパラメータで、より複雑な場合には

foo.bar.send(condition? ? :get_this : :get_that).baz 

を1にできましたパラメータに配列をアンラップするsplat operatorを使用:

foo.bar.send(
    * case conditional 
    when qux 
     [:get_this, param1] 
    when quux 
     [:get_that, param1, param2] 
    else 
     [:get_other, param1, param2] 
    end 
).baz 
+0

私は参照してください。これは、問題を部分的に解決します。つまり、 'get_this'と' get_that'が(おそらく引数を使って)単純な方法です。もっと複雑なときにも考えてみましょうか?あなたの答えはいい考えです。 – sawa

+0

編集した回答を参照してください! – clyfe

+0

うん。それは私が単純な(単一の)方法として言及したものです。しかし時には、異なる条件の下で別々に行うべきことのシーケンスがあります。しかし、あなたの答えはいいです。 – sawa

2

時々ローテクなソリューションがベストです:真剣

my_bar = foo.bar 
if condition 
    my_thing = my_bar.get_this 
else 
    my_thing = my_bar.get_that 
end 
my_thing.baz 

、私はそれがはるかに重要なソースコードの意味は皆様に100%明確であることを(自分で将来のある時点を含む)を検討しますそれは1行または2行で短縮されています。

+1

それは大丈夫ですが、私はそれがより慣用的だと思います。 'my_thing = if condition ...' – tokland

+0

多分 'my_thing =(condition?...:)'。個人的には、技術的には式であっても、 'if'の値を使う方法はありません。 – Lindydancer

+0

場合によっては、私はそれを行う必要があると思う。 – sawa

関連する問題