保存并重复使用块进行方法调用

Mou*_*hyi 10 ruby

我使用相同的块多次调用 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)
Run Code Online (Sandbox Code Playgroud)

我明白了: Syntax error, unexpected tAMPER

Phr*_*ogz 20

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

bar.get(&foo)
jim.get(&foo)
jam.get(&foo)
Run Code Online (Sandbox Code Playgroud)

在方法调用中将一个&符号放在项目前面,例如a.map!(&:to_i)调用该to_proc对象上的方法并将生成的proc作为块传递.定义可重用块的一些替代形式:

foo = Proc.new{ |a,b,c| ... }
foo = proc{ |a,b,c| ... }
foo = ->(a,b,c){ ... }
Run Code Online (Sandbox Code Playgroud)

如果要调用带有块的方法并且希望保存块以便以后重用,可以通过在方法定义中使用&符号将块作为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!
Run Code Online (Sandbox Code Playgroud)