Ruby每个对象都有语法解释

Ruby每个对象都有语法解释,ruby,Ruby,为什么这些不平等 ['a'].each_with_object('b'){|x,memo| memo << x} => "ba" ['a'].each_with_object('b', &:<<) => "b" ['a']。每个_都带有_对象('b'){x,memo | memo“ba” ['a']。每个带有对象('b',&:Symbol#to_proc的_返回一个arity的proc实例-1: :<<.to_proc.arity #⇒

为什么这些不平等

['a'].each_with_object('b'){|x,memo| memo << x}
=> "ba"

['a'].each_with_object('b', &:<<)
=> "b"
['a']。每个_都带有_对象('b'){x,memo | memo“ba”
['a']。每个带有对象('b',&:
Symbol#to_proc
的_返回一个arity的
proc
实例
-1

:<<.to_proc.arity
#⇒ -1
返回
“ba”
字符串

您的代码的工作方式相同:

arr = ['a']
arr.each_with_object('b', &:<<)
arr
#⇒ ['ab']
arr=['a']

arr.each_with_object('b',&:返回的对象是传递给
each_with_object
的第一个参数。在第一个示例中,第一个对象
“b”
附加了返回的“
a
”。在第二个示例中,接收器
“a”
的元素附加了第一个参数
“b”
,但第一个参数没有发生任何变化。

第二个代码与第一个输出不一样。但我不知道从哪里开始解释。:)在你的第二个代码
memo
'b'
x
'a'
。但是
备忘录你能写出第二个例子的长格式等价物并将其作为答案提交吗?这个答案描述了
&
操作符是如何工作的,也许能解释为什么这两个操作符不等价:你看起来像这里的C实现:。如果你不了解C,就像我一样。你可能会发现这很有趣:
['a'].reduce('b',&:@jphager2“即使字符串确实连接了”-字符串确实连接了,请参见我的答案。
Symbol#to_proc
的旧rails实现是
proc.new{|*args|args.shift.\uu发送(self,args)}
@jphager2它与当前的实现和/或我提供的代码片段有什么不同(除了我的版本没有变异
args
array,考虑到
args
都在堆栈上,这是没有意义的)?当前的实现是用C编写的,并且做了很多事情,比如试图在缓存中查找进程、将进程标记为垃圾收集等。实际上,我认为您的实现有一个bug,假设您在一个符号实例的上下文中。如果您你指的是当前的Rails、实现,那么就没有了,因为符号#to_proc现在是在Ruby中定义的。
arr = ['a']
arr.each_with_object('b', &:<<)
arr
#⇒ ['ab']
arr = ['a', 'b']
arr.each_with_object('z', &:<<)
arr
#⇒ ['az', 'bz']