Ruby块、过程和实例评估
我最近尝试做了类似的事情:Ruby块、过程和实例评估,ruby,block,lambda,proc-object,Ruby,Block,Lambda,Proc Object,我最近尝试做了类似的事情: a = "some string" b = Proc.new{ upcase } a.instance_eval b 这就产生了错误: TypeError:无法将进程转换为字符串 但这是可行的: def b(&block) "some string".instance_eval &block end b{ upcase } 进一步了解此方法: def b(&block) "some string".instance_eval bl
a = "some string"
b = Proc.new{ upcase }
a.instance_eval b
这就产生了错误:
TypeError:无法将进程转换为字符串
但这是可行的:
def b(&block)
"some string".instance_eval &block
end
b{ upcase }
进一步了解此方法:
def b(&block)
"some string".instance_eval block
end
产生相同的Proc to String
错误
所以。。。我对块的理解是它们只是过程。但是很明显,使用这个&符号和符号有一些特别之处
有人能给我解释一下吗?是否可以将正常进程转换为该&block
对象的特殊进程
编辑
刚刚解决了我的第二个问题,在过程中添加一个
&
。。。这很容易,但这到底是在做什么呢?这是因为instance\u eval接受一个字符串来eval或一个块<代码>实例求值(&block)将您的块
作为块传递给实例求值。要让第一个示例工作,您需要做的就是:
>> a.instance_eval &b #=> "SOME STRING"
原因是
instance\u eval
需要一个字符串或一个块,而符号and提供后者。关键区别在于过程实例是一个对象,而块不是一个对象。&
是一个操作符,它将块和过程实例相互交换
方法的所有参数都必须是对象。除了参数之外,方法还可以接受块
instance_eval
是一种接受字符串参数或块的方法。传递Proc对象将不满足这两种情况。如果将&
附加到Proc对象,则该对象将作为块处理。不同之处在于a.instance\u eval b
将b
作为常规参数传递给instance\u eval,而a.instance\u eval&b
将其作为块传递。这是两件不同的事情
考虑此方法调用:
obj.foo(bar) do |x|
stuff(x)
end
使用一个常规参数(bar
)和一个块参数(do | x | stuff(x)end
)调用方法foo
)。在方法定义中,它们通过在块参数前加前缀&
来区分:
def foo(arg, &block)
如果您希望传递一个变量表达式而不是一个文本块,同样可以通过在表达式前面加前缀来实现(这将产生一个Proc)
如果传递的参数没有&
,则它将进入arg插槽而不是块插槽。参数是否恰好是Proc的实例并不重要。语法规定了方法如何传递和处理它。这将起作用:
a = "some string"
b = Proc.new{ upcase }
a.instance_eval &b
instance\u eval
方法可以接收块参数。
b
是一个Proc
但是block
和Proc
之间有什么区别呢?当我写这个问题并询问其他人时,我是如何开始解决这个问题的,这很有趣。。。最后我意识到我只需要知道proc和block之间的区别。非常感谢你!!死链接提供了很好的简明答案,谢谢!(很抱歉,我已经接受了@Michaels,因为他告诉我区块和过程之间的差异)