gpt4 book ai didi

ruby - 奇怪的 Ruby 行为

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:18 24 4
gpt4 key购买 nike

我需要检查变量是否为数组,如果不是,则在进行进一步处理之前将其转换为数组。所以,我的代码如下所示:

class Test < Struct.new(:args)
def eval
p "1. #{args}"
args = (args.instance_of? Array) ? args : [args]
p "2. #{args}" # woah! [nil]?
# ...other things, with "args" being an array for sure..or not?!?
end
end

我是 ruby​​ 的新手,所以也许这不是很惯用,但在我看来这段代码至少应该可以工作。相反,我第二次打印 args 变量时,它是 [nil]。请注意,如果我稍微更改方法 eval:

def eval
p "1. #{args}"
a = args
args = (a.instance_of? Array) ? a : [a]
p "2. #{args}"
end

一切正常。那么,是否有一些我不明白的非常具体的 Struct 类,或者这里发生了什么可疑的事情?(在 macosx 上使用 ruby​​ 1.9.3-dev,使用 rvm)

最佳答案

实际上,有一个 Ruby 惯用语可以说明您要尝试执行的操作:[*args]* 在此上下文中称为 splat 运算符:

http://raflabs.com/blogs/silence-is-foo/2010/08/07/ruby-idioms-what-is-the-splatunary-operator-useful-for/

如果你传递一个数组,splat 会将数组“扁平化”成新的数组,如果你传递一个参数,它将变成一个单元素数组。

对于奇怪的行为:在我看来你在 eval 方法中创建了一个局部变量 args,它被初始化为 nil因为它在作业的左手边。然后三元计算结果为 false,因为 args 不是一个数组并生成一个当前值的数组,它仍然是 nil。如果 args 是一个实例变量 (@args),事情就会按照您期望的方式进行。换句话说,虽然从 Struct 继承将为您提供 argsargs= 方法,但它不会为您提供 @ args 实例变量。

关于ruby - 奇怪的 Ruby 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7089987/

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