gpt4 book ai didi

ruby - Ruby 中的奇怪之处

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

我有一个简单的 if 语句,它的行为非常奇怪。当我在 if 语句中为 attr_accessor 赋值时,它会清除该值。下面是一个演示该问题的简明示例。

class FName
attr_accessor :name
attr_accessor :file_ext

def full_name
puts "initial file_ext value: #{file_ext}"
if file_ext.nil?
file_ext = ".default"
end
puts "new file_ext value: #{file_ext}"
"#{name}#{file_ext}"
end
end

f = FName.new
f.name = "foo"
f.file_ext = ".txt"
puts f.full_name

输出如下:

initial file_ext value: .txt
new file_ext value:
foo

这完全不是您所期望的。有人知道这里发生了什么吗?

请注意,我可以在 Ruby 2.0.0-p247 和 Ruby 2.1.1_1 中重现此问题。另请注意,如果我删除 file_ext = ".wrong" 行,那么当 file_ext 不是 nil 时,代码示例的行为与预期一致,但当然我无法提供默认值当 file_ext 为零时。

我已经尝试将 puts 语句放入 if block 中,并且(如预期的那样)它们不打印任何内容。当我删除行 f.file_ext = ".txt" 然后我得到输出:

initial file_ext value:
new file_ext value: .default
foo.default

最后一点:我希望像这样懒惰地提供默认值,因为在我的真实代码中计算了该值,我希望除非必要,否则避免计算。

希望有人能告诉我为什么会这样!

最佳答案

这是 Ruby 的一个怪癖。线路

      file_ext = ".default"

必须改为

      self.file_ext = ".default"

如果没有 self.,一个局部变量 file_ext 会自动创建,以代替您想要的访问器调用。

即使 if 主体由于 Ruby 变量声明语义而未执行,它也会被创建。它会自动获取值 nil,打印为空字符串。这是 Ruby RDoc 的摘录:

The local variable is created when the parser encounters the assignment, not when the assignment occurs:

     a = 0 if false # does not assign to a
p local_variables # prints [:a]
p a # prints nil

我和你一样痛苦,因为 Ruby 语法的这个“特性”我总共损失了几个小时。 Ruby 的很多地方确实很漂亮,但这是糟糕的语言设计。

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

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