2016-04-08 3 views
-3

私はブロックを取る関数を持っています。このブロックにもブロックが必要です:Rubyブロックからどうやって生産するのですか?

def fn 
    yield do n 
    puts n 
    end 
end 

fn do 
    yield 1 
end 

このコードは "1"を出力します。何それは実際には、しかし、失敗しているん:

構文エラー、予期しないkeyword_do

私は機能ではなく、procのを取ることができます:

def fn(&block) 
    block.() do n 
    puts n 
    end 
end 

しかし、この場合には、コードが降伏線で失敗する:

与えられたブロックなし(LocalJumpError)

私は、内側のブロックPROCしたくない:

fn do |&block| 
    block.(1) 
end 

それはひどい見えますので。私は代わりに、少なくとも内側のブロックで収穫したいと思います。これをどうすれば解決できますか?

+1

ラムダとプロックスはひどく見えません。その評判に値するものではありません。 – Fuser97381

+0

私はそれを汚染と呼んでいません。それはあなたの質問ではありません。あなたは自動的に創造的なコモンズになるこのサイトで公開することによってすべての権利を断念した。所有権を主張することはできません。 – Fuser97381

答えて

1

procsの使用に関する問題は、あなたが醜い構文を使用することです。だから彼らはひどく見えるのです。 .callの使い方は、はるかに一般的です:

あなたの2つの試みが失敗した理由については
def fn(&block) 
    block.call do |n| 
    puts n 
    end 
end 

fn do |&block| 
    block.call(1) 
end 

、順番に:

  1. yieldがキーワードではなく、メソッド呼び出しです。だからこそ、あなたはそれをブロックに渡すことができませんでした。
  2. yieldは、現在のブロックになります。しかし、そのコンテキストにはブロックがありません。fn呼び出しは、ブロックが渡されたメソッド呼び出しではありません。トップレベルの式として実行されます。

要約すると:procsを使用します。 yieldでこれを行うことを諦めてください。

関連する問題