gpt4 book ai didi

to_proc 的 ruby​​ 和快捷方式似乎行为不正常

转载 作者:行者123 更新时间:2023-12-02 09:03:32 28 4
gpt4 key购买 nike

所以我正在尝试弄清楚 sym.to_proc 方法是如何工作的,假设任何实现 to_proc 的对象都有一个速记,它只是一个 & 在对象之前,但是这个速记的行为似乎不稳定:

这行得通

irb(main):022:0> p = :to_s.to_proc
=> #<Proc:0x00000000056c33b0(&:to_s)>

但这不是

irb(main):023:0> p = &:to_s
Traceback (most recent call last):
3: from X:/Ruby26-x64/bin/irb.cmd:31:in `<main>'
2: from X:/Ruby26-x64/bin/irb.cmd:31:in `load'
1: from X:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
SyntaxError ((irb):23: syntax error, unexpected &)
p = &:to_s
^

现在反过来,这行得通

irb(main):024:0> (0..10).map &:to_s
=> ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]

但这不是!

irb(main):025:0> (0..10).map(:to_s.to_proc)
Traceback (most recent call last):
5: from X:/Ruby26-x64/bin/irb.cmd:31:in `<main>'
4: from X:/Ruby26-x64/bin/irb.cmd:31:in `load'
3: from X:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
2: from (irb):25
1: from (irb):25:in `map'
ArgumentError (wrong number of arguments (given 1, expected 0))

这些错误似乎没有意义,我真的很茫然。

最佳答案

& 一元前缀和运算符/sigil 可以用在恰好两个地方:

  • 参数列表中。
  • 参数列表中。

参数列表中,&一元前缀&符号表示“将作为参数传递的 block ,将其卷入Proc 对象,并将其绑定(bind)到此参数。"

参数列表中,& 一元前缀和运算符表示“获取作为参数传递的Proc 对象,展开它进入一个 block ,并将其作为 block 参数传递。”更准确地说,这就是启用像 Symbol#to_proc 这样的“技巧”的原因,它意味着“获取作为参数传递的 Proc 对象或转换对象如果它还不是 Proc,则使用 to_proc,将其展开到一个 block 中,并将其作为 block 参数传递。”

从某种意义上说,两者正好相反。

在第一个示例的第二种情况下,您既没有参数列表也没有参数列表,因此 & 一元前缀&符号和 & 一元前缀&符号运算符都没有在句法上是合法的。

在第二个示例的第二种情况下,您将 :to_s.to_proc 的结果作为 Proc 对象作为参数传递给 Range# map 。但是,Range#map 没有任何参数(Ruby 中每个方法都有的隐式 block 参数除外),因此您传递了一个不需要参数的参数。你必须将你的 Proc 参数展开成这样的 block :

(0..10).map(&(:to_s.to_proc))

可以缩短为

(0..10).map(&:to_s)

因为如果操作数还不是 Proc 对象,& 一元前缀 & 运算符将自行执行转换。

关于to_proc 的 ruby​​ 和快捷方式似乎行为不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61137447/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com