我是 Ruby 的新手,我有一个问题:以下代码中是否需要 nil 检查? 你能解释一下吗?提前谢谢你!!如果您认为这太容易回答,请告诉我我需要检查以解决我的疑问的文档(或链接(吗?这是最初的问题:在 say_hi 方法中,作者检查实例变量@names是否为 nil。为什么要进行此检查?在编写时,MegaGreeter 类中真的需要支票吗?为什么或为什么不呢?
class MegaGreeter
attr_accessor :names
# Create the object
def initialize(names = "World")
@names = names
end
# Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @names.respond_to?("each")
# @names is a list of some kind, iterate!
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end
# Say bye to everybody
def say_bye
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Join the list elements with commas
puts "Goodbye #{@names.join(", ")}. Come back soon!"
else
puts "Goodbye #{@names}. Come back soon!"
end
end
end
if __FILE__ == $0
mg = MegaGreeter.new
mg.say_hi
mg.say_bye
# Change name to be "Zeke"
mg.names = "Zeke"
mg.say_hi
mg.say_bye
# Change the name to an array of names
mg.names = ["Albert", "Brenda", "Charles",
"Dave", "Engelbert"]
mg.say_hi
mg.say_bye
# Change to nil
mg.names = nil
mg.say_hi
mg.say_bye
end
值设定项的设置方式,@names
永远不应该nil
,因为如果未提供任何内容,则会分配默认值"World"。
问题是 MegaGreeter
类中的公共attr_accessor
,您可以在此处阅读有关此方法的信息。它在@names
实例变量上创建一个 setter 方法,这意味着它可以更改为任何内容,包括 nil
。