gpt4 book ai didi

ruby - 为什么在 *a = ""之前调用 p 时,splat/一元运算符会更改分配的值 a ?

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:53 25 4
gpt4 key购买 nike

就我如何理解这个问题给出一些背景信息。

在字符串上使用 splat collect 将 :to_a 或 :to_ary 发送到字符串

class String
def method_missing method, *args, &block
p method #=> :to_ary
p args #=> []
p block #=> nil
end
end

*b = "b"

所以我想重新定义 :to_ary 方法就是我所追求的。

class String
def to_ary
["to_a"]
end
end

p *a = "a" #=> "a"
p a #=> "a"

*b = "b"
p b #=> ["to_a"]

现在这让我很困惑。

打印 *a = "a"的结果会改变分配给 a 的值吗?

进一步证明

class String
def to_ary
[self.upcase!]
end
end

p *a = "a" #=> "a"
p a #=> "a"

*b = "b"
p b #=> ["B"]

最佳答案

很有意思的问题! Ruby 采用以下表达式:

 p *a = "a"

并将其翻译成这样:

 temp = (a = "a")
p *temp

所以首先发生的事情是 a 被分配给 "a",然后是赋值表达式的结果 “a” 被拼接并发送到 p。由于 p 在发送多个参数时的默认行为只是遍历并打印每个参数,因此您只会看到 "a" 出现。

简而言之,它遵循“赋值然后 splat”的评估顺序。所以 a 在字符串被展开之前被分配给 "a"

然而,当您没有函数调用时,它会被解释为如下内容:

# *a = "a" gets interpreted as:
temp = "a"
a = *temp

这遵循“splat then assign”的评估顺序。因此 a 在字符串被展开后 被赋值。

您可以像这样查看函数接收的内容:

def foo *args
puts args.inspect
end

foo *a = "a" # outputs ["a"]
a # outputs "a"

希望这能澄清正在发生的事情!

简而言之(感谢 Mark Reed):

p *a = "a"    # interpreted as: p(*(a = "a"))
*a = "a" # interpreted as: a = *("a")

关于ruby - 为什么在 *a = ""之前调用 p 时,splat/一元运算符会更改分配的值 a ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10900726/

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