bra*_*rad 13 ruby lambda block proc-object
我最近尝试做类似于此的事情:
a = "some string"
b = Proc.new{ upcase }
a.instance_eval b
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
TypeError:无法将Proc转换为String
但这有效:
def b(&block)
"some string".instance_eval &block
end
b{ upcase }
Run Code Online (Sandbox Code Playgroud)
进一步了解这种方法:
def b(&block)
"some string".instance_eval block
end
Run Code Online (Sandbox Code Playgroud)
产生相同的Proc to String
错误.
所以...我对块的理解是它们只是触发器.但是这个&
&符号显然有一些特别之处......
谁可以给我解释一下这个?是否有可能将正常的proc转换成&block
对象的特殊之处?
刚刚想出了我的第二个问题,在前面加了一个&
...这很容易,但这是真的在做什么?
Mic*_*ohl 22
你需要做的第一个工作就是:
>> a.instance_eval &b #=> "SOME STRING"
Run Code Online (Sandbox Code Playgroud)
原因是instance_eval
需要一个字符串或一个块,而&符号需要后者.
为了理解块和过程之间的差异,可能以下博客文章有助于:
Mar*_*eed 11
区别在于a.instance_eval b将b作为常规参数传递给instance_eval,而a.instance_eval&b将其作为块传递.这是两件不同的事情.
考虑这个方法调用:
obj.foo(bar)do | x | 东西(x)结束
它使用一个常规参数(bar)和一个块参数(do | x | stuff(x)end)调用方法foo.在方法定义中,它们通过前缀&和块参数来区分:
def foo(arg,&block)
...
结束
如果你希望传递一个变量表达式而不是一个文字块,那么同样通过前缀&表达式(它应该产生一个Proc)来实现.
如果传递一个没有&的参数,它将进入arg槽而不是块槽.论证恰好是Proc的一个实例并不重要.语法规定了该方法如何传递和处理它.
归档时间: |
|
查看次数: |
9169 次 |
最近记录: |