Ruby Procs - 以语法错误结束
Ruby Procs - ends up with syntax error
试图了解 Ruby 上的 Procs,为此我正在尝试一些练习。
首先我输入这一行
[1, 4, 5, 3].map(&:anything)
结果我得到一个错误:
NoMethodError: undefined method anything' for 1:Fixnum
.
那我试试这个:
[1, 4, 5, 3].map(&:to_s)
并返回一个将数字转换为字符串的新数组:
=> ["1", "4", "5", "3"]`.
通过这两个示例,我可以得出结论,当我调用类似以下内容时: [1, 4, 5, 3].map(&:anything)
会为数组中的每个元素调用 anything
方法。因为 Fixnum 没有实现 anything
方法,所以第一个示例以错误结束,第二个示例通过。
然后我想,如果Fixnum有一个+
方法,那么我可以调用[1, 4, 5, 3].map(&:+2)
。但这以语法错误结束:
syntax error, unexpected tINTEGER, expecting ')' [1, 4, 5, 3].map(&:+2)
如果 Fixum 有一个 +
方法,为什么这最后一个给我这个语法错误?我做错了什么?
&:method_name
是一个可以代替 {|x| x.anything}
的快捷方式 - 仅此而已。它可以被任何接收块的方法使用。
# So this line...
[1,2,3].map(&:anything)
# ... is equivalent to this line
[1,2,3].map {|x| x.anything }
# Same can go here:
[job1, job2, job2].each(&:process)
请注意,您只能将它用于不接收任何参数的方法。由于您试图发送参数 2
,您收到了语法错误。
&
是调用to_proc
方法的快捷方式。
因为您有一个符号 (:anything
),所以在符号上调用了 to_proc
方法。这个 returns 一个过程,它将在作为参数传递的对象上调用具有相应名称 (anything
) 的方法。
如果您使用像 map
这样的枚举器来执行此操作,那么您实际上是在集合中的每个对象上调用该方法。
现在这个快捷方式不允许您将参数传递给方法。 (+
只是语法糖,用于在以另一个方法为参数的数字上调用方法)
但是您可以对这样的用例使用柯里化:
add = -> (a, b) { a + b }
add_two = add.curry.call(2)
p [1,2,3,4].map(&add_two) # => [3, 4, 5, 6]
试图了解 Ruby 上的 Procs,为此我正在尝试一些练习。
首先我输入这一行
[1, 4, 5, 3].map(&:anything)
结果我得到一个错误:
NoMethodError: undefined method
anything' for 1:Fixnum
.
那我试试这个:
[1, 4, 5, 3].map(&:to_s)
并返回一个将数字转换为字符串的新数组:
=> ["1", "4", "5", "3"]`.
通过这两个示例,我可以得出结论,当我调用类似以下内容时: [1, 4, 5, 3].map(&:anything)
会为数组中的每个元素调用 anything
方法。因为 Fixnum 没有实现 anything
方法,所以第一个示例以错误结束,第二个示例通过。
然后我想,如果Fixnum有一个+
方法,那么我可以调用[1, 4, 5, 3].map(&:+2)
。但这以语法错误结束:
syntax error, unexpected tINTEGER, expecting ')' [1, 4, 5, 3].map(&:+2)
如果 Fixum 有一个 +
方法,为什么这最后一个给我这个语法错误?我做错了什么?
&:method_name
是一个可以代替 {|x| x.anything}
的快捷方式 - 仅此而已。它可以被任何接收块的方法使用。
# So this line...
[1,2,3].map(&:anything)
# ... is equivalent to this line
[1,2,3].map {|x| x.anything }
# Same can go here:
[job1, job2, job2].each(&:process)
请注意,您只能将它用于不接收任何参数的方法。由于您试图发送参数 2
,您收到了语法错误。
&
是调用to_proc
方法的快捷方式。
因为您有一个符号 (:anything
),所以在符号上调用了 to_proc
方法。这个 returns 一个过程,它将在作为参数传递的对象上调用具有相应名称 (anything
) 的方法。
如果您使用像 map
这样的枚举器来执行此操作,那么您实际上是在集合中的每个对象上调用该方法。
现在这个快捷方式不允许您将参数传递给方法。 (+
只是语法糖,用于在以另一个方法为参数的数字上调用方法)
但是您可以对这样的用例使用柯里化:
add = -> (a, b) { a + b }
add_two = add.curry.call(2)
p [1,2,3,4].map(&add_two) # => [3, 4, 5, 6]