gpt4 book ai didi

Ruby 变量作用域

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

# encoding: utf-8
class Person
attr_reader :short_name
def initialize(short_name)
@short_name = short_name
end

def greeting_line
short_name = short_name.downcase
"Hello #{short_name}"
end
end

person = Person.new("MS. LEE")

puts person.short_name => "MS. LEE"
puts person.greeting_line => NoMethodError: undefined method `downcase' for nil:NilClass

异常发生在 "short_name = short_name.downcase"因为 (short_name = short_name) 使 short_name 变为 nil。

为什么右边的“short_name”不是从实例方法“short_name”中获取值?

最佳答案

当你说

var = value

总是引用局部变量var,即使您有方法varvar=定义。 (在你的例子中,你有 attr_reader 定义的方法 short_name,但是你没有定义 short_name=。)

您有几种解决方法。可以直接使用实例变量:

@var = value

或者您可以使用带有显式 self 接收器的 var= 方法:

self.var = value

第二种形式只有在你定义了一个 var= 方法时才有效,无论是显式定义,还是使用 attr_accessorattr_writer

现在,当你做类似的事情时

foo = foo

总是 在左侧引入一个局部变量foo。当 ruby​​ 在 = 的右侧看到 foo 时,它解析为 local variable foo,因为foo 现在在范围内。所以这总是将 foo 设置回其默认值 nil

关于Ruby 变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629582/

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