12

RestClient :: Resource#get(additional_headers = {}、&block)メソッドを同じブロックで複数回呼び出してい ますが、異なるリソースで、ブロックを変数に保存する方法があるのか​​、それとも保存する方法があるのか​​疑問に思いました。 Procに変換するたびにブロックに変換します。

編集:

私は次のことをしました:

resource = RestClient::Resource.new('https://foo.com')
redirect  =  lambda do  |response, request, result, &block|
  if [301, 302, 307].include? response.code
     response.follow_redirection(request, result, &block)
   else
      response.return!(request, result, &block)
   end
end
@resp = resource.get (&redirect)

私は得る:Syntax error, unexpected tAMPER

4

1 に答える 1

23
foo = lambda do |a,b,c|
   # your code here
end

bar.get(&foo)
jim.get(&foo)
jam.get(&foo)

メソッド呼び出しでアイテムの前にアンパサンドを配置します。たとえば、そのオブジェクトでメソッドをa.map!(&:to_i)呼び出しto_proc、結果のprocをブロックとして渡します。再利用可能なブロックを定義するいくつかの代替形式:

foo = Proc.new{ |a,b,c| ... }
foo = proc{ |a,b,c| ... }
foo = ->(a,b,c){ ... }

ブロックを使用してメソッドを呼び出していて、後で再利用するためにそのブロックを保存する場合は、メソッド定義でアンパサンドを使用して、ブロックをprocパラメーターとしてキャプチャします。

class DoMany
  def initialize(*items,&block)
    @a = items
    @b = block # don't use an ampersand here
  end
  def do_first
    # Invoke the saved proc directly
    @b.call( @a.first )
  end
  def do_each
    # Pass the saved proc as a block
    @a.each(&@b)
  end
end

d = DoMany.new("Bob","Doug"){ |item| puts "Hello, #{item}!" }

d.do_first
#=> Hello, Bob!

d.do_each
#=> Hello, Bob!
#=> Hello, Doug!
于 2012-05-25T16:21:12.343 に答える