2009-07-29 12 views
3

ruby​​を使ってインラインステートメントでブロックを定義することはできますか?ruby​​でブロックをインラインで定義できますか?

tasks.collect(&:title).to_block{|arr| "#{arr.slice(0, arr.length - 1).join(", ")} and #{arr.last}" } 

これに代えて:このような何か

titles = tasks.collect(&:title) 
"#{titles.slice(0, titles.length - 1).join(", ")} and #{titles.last}" 

あなたはtasks.collect(&:title).slice(0, this.length-1)がどのように「これは」)(スライスする渡された完全な配列を参照することができた場合は?

基本的には、あるステートメントから返されたオブジェクトを別のステートメントに渡す方法を探していますが、必ずしも繰り返し処理する必要はありません。

答えて

4

メソッド/関数への戻り値を渡して、返された値に対してメソッドを呼び出すのは混乱します。あなたが説明したものを行う方法はこれです:

lambda {|arr| "#{arr.slice(0, arr.length - 1).join(", ")} and #{arr.last}"}.call(tasks.collect(&:title)) 

あなたはそれをあなたがしようとしたやり方をしたい場合は、最も近いものは、あなたがオブジェクトのコンテキスト内でブロックを実行することができますされ、instance_evalです。したがって、それは次のようになります:

tasks.collect(&:title).instance_eval {"#{slice(0, length - 1).join(", ")} and #{last}"} 

しかし、私はそれらのどちらもやっていないでしょう。

1

私はあなたが何をしようとしている正確にわからないんだけど、:

あなたが言った場合tasks.collect(&:タイトル).slice(0、this.length-1)どのようにすることができますスライス()に渡された配列全体を 'this'とします。

負の数を使用しますで、また

tasks.collect(&:title)[0..-2] 

を:

"#{titles.slice(0, titles.length - 1).join(", ")} and #{titles.last}" 

あなたが引用符で起こって奇妙な何かを持って、私は思います。

+0

おかげで、。 – bwizzy

1

あなたがしたいと、なぜ私は本当に理解していないが、あなたはブロックを取るRubyのクラスに機能を追加することができ、パラメータとしての地位を渡す...

class Object 
    def to_block 
    yield self 
    end 
end 

この時点で、もちろん

tasks.collect(&:title).to_block{|it| it.slice(0, it.length-1)} 

を、他のライブラリと組み合わせたときに深刻な影響があることができるようにObjectクラスは軽く取られるべきではない修正:あなたが呼び出すことができるでしょう。

+0

ブロックを行う方法はありますか?自己インラインで生産しますか? – bwizzy

+0

オブジェクトとしてパラメータを取るグローバル関数を作成し、ブロックを受け取り、渡されたパラメータでブロックのyieldを呼び出していると思います。この関数は次のようになります:def to_block(para)yield para end次に、あなたの呼び出しはto_block(tasks。コレクション(&:タイトル)){| it | it.slice(0、it.length-1)}私の意見では、これはルビコードの自然な流れに逆らっていますが、それは可能です。私はこれを手配する他の方法は実際には見ません。 – krdluzni

0

に多くの良い答えがここにありますが、おそらくあなたは目的の面でより多くのこのような何かを探している:負の数について知ってもいい

class Array 
    def andjoin(separator = ', ', word = ' and ') 
    case (length) 
    when 0 
     '' 
    when 1 
     last.to_s 
    when 2 
     join(word) 
    else 
     slice(0, length - 1).join(separator) + word + last.to_s 
    end 
    end 
end 

puts %w[ think feel enjoy ].andjoin # => "think, feel and enjoy" 
puts %w[ mitchell webb ].andjoin # => "mitchell and webb" 
puts %w[ yes ].andjoin # => "yes" 

puts %w[ happy fun monkeypatch ].andjoin(', ', ', and ') # => "happy, fun, and monkeypatch" 
関連する問題