我使用相同的块多次调用 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
答案 0 :(得分:19)
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!