调用"respond to"方法时是否需要 Ruby NIL 检查?



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

相关内容

  • 没有找到相关文章

最新更新