2011-01-04 6 views
0

Rubyのブロックと収量

yield self if block 

ある何それが唯一の開始方法に添付ブロックがあった場合、それが最後に呼び出されます意味ですか?

def initialize options = {}, &block 

    @type = self.class.to_s.split('::').last.downcase.to_sym 
    @version = options.delete(:version) || 1.0 
    @language = options.delete(:language) || :en 
    @query = options.delete(:query) 
    @api_key = options.delete(:key) || :notsupplied 
    @options = options 
    raise Error, 'Do not initialize Google::Search; Use a subclass such as Google::Search::Web' if @type == :search 
    yield self if block 
+2

このコードはどこから来ましたか?ブロックを '&block'で無意味に取り込むのは良い考えではありません(代わりに' block_given? 'を使用してください)。私はまた、私のオプションをそのまま残さない方法を嫌い... http://blog.marc-andre.ca/2009/03/leave-my-options-alone.html –

+0

私は公式のGoogle検索からコードを得たRubyの宝石。 – mabounassif

答えて

2

うん、かなり。どこ、

Google::Search::Web.new do |search| 
    # ... 
end 

(けれどもが、ビューのソフトウェアの設計点から、コンストラクタでユーザーが指定したコードを実行すると、いつも私には奇妙に思えたより良いアプローチは何をすべきかFileIOです。だからあなたのような何かを行うことができますnewがないのに対し、そのopenは、渡されたブロックを実行している以外openは、newとしてほとんど同じことをする)

2

あなたは、このような方法で記述した場合:。

def foo(a, b, &c) 
    ... 
end 

ブロックをメソッドに渡すと変数cはProcインスタンスに設定され、ブロックを渡さない場合はnilに設定されます。 nilは真実でない値なので、引用する方法は、ブロックが渡されたかどうかを調べて、結果を出すかどうかを判断することです。

@MarcAndréLafortuneによると、より良いコードはyield if block_given?です。 (私は考えることができることを)あなたがブロックをキャプチャするだけの時間されています

  1. 後で使用するために、インスタンス変数にそれを保存するために:
    • 例えば@foo = cを呼び出し、それを呼び出して値(@foo[ 42 ])を渡すか、ブロックとして別のメソッドmy_array.select(&@foo)に渡します。
      • 例えば:
    • それとも、あなたのメソッドによって呼び出された他の方法とブロックとして直接それに沿って渡します@my_array = initial_values.select(&c)