在调用“响应”方法时,是否需要检查红宝石?

时间:2016-02-08 22:52:28

标签: ruby

我是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

1 个答案:

答案 0 :(得分:0)

设置初始值设定项的方式,@names永远不应为nil,因为默认值为' World'如果没有提供,则被分配。

问题是attr_accessor类中的公开MegaGreeter,您可以阅读此方法here。它在@names实例变量上创建了一个setter方法,这意味着它可以更改为任何内容,包括nil