Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby块、过程和实例评估_Ruby_Block_Lambda_Proc Object - Fatal编程技术网

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,因为他告诉我区块和过程之间的差异)