我是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
答案 0 :(得分:0)
设置初始值设定项的方式,@names
永远不应为nil
,因为默认值为' World'如果没有提供,则被分配。
问题是attr_accessor
类中的公开MegaGreeter
,您可以阅读此方法here。它在@names
实例变量上创建了一个setter方法,这意味着它可以更改为任何内容,包括nil
。