gpt4 book ai didi

ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:09 28 4
gpt4 key购买 nike

由于匿名 block 和散列 block 看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:

{}.class
#=> Hash

好的,这很酷。空 block 被视为Hash

print{}.class
#=> NilClass
puts {}.class

#=> NilClass

为什么上面的代码和NilClass一样,下面的代码又显示了Hash

puts ({}.class)
#Hash
#=> nil
print({}.class)
#Hash=> nil

谁能帮我理解上面发生了什么?

我完全不同意@Lindydancer的观点

你如何解释下面几行:

print {}.class
#NilClass
print [].class
#Array=> nil
print (1..2).class
#Range=> nil

为什么下面的print[].classprint(1..2).class不一样?

编辑

local variablemethod 调用发生歧义时,Ruby 会抛出如下错误:

name
#NameError: undefined local variable or method `name' for main:Object
# from (irb):1
# from C:/Ruby193/bin/irb:12:in `<main>'

现在 {} 的情况不一样(因为 empty code blockHash block 之间也存在歧义)。由于 IRB 在这里也不确定它是 empty block 还是 Hash。那为什么IRB遇到print {}.class或者{}.class时,没有抛出错误呢?

最佳答案

ruby 的优先级规则使得print{}.class 被解释为(print{}).class。由于 print 显然返回 nil,因此 class 方法返回 #NilClass

编辑:正如在其他答案和问题更新中讨论的那样,打印{}当然解释为调用 print 使用 block ,而不是哈希。但是,这仍然是关于优先级的,因为 {} 绑定(bind)比 [](1..2) 强(并且强于 就此做...结束)。

关于ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15339132/

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