为什么这个Ruby方法需要是类级方法?

时间:2012-02-28 00:41:28

标签: ruby class

这是Ruby中的经典fizzbuzz:

class PrimeChecker
  def print_em
    1.upto 100 do |fizzbuzz|
      if (fizzbuzz % 2) == 0 && (fizzbuzz % 5) == 0
        puts "fizzbuzz: " + fizzbuzz.to_s
      elsif (fizzbuzz % 5) == 0
        puts "fizz: "+fizzbuzz.to_s
      elsif (fizzbuzz % 2) == 0
        puts 'buzz: ' + fizzbuzz.to_s
      else
        puts "-" + fizzbuzz.to_s
      end
    end
  end
end
PrimeChecker.print_em

当我执行此操作时,我收到此错误:

  

未定义的方法'print_em'。

我将方法更改为self.print_em并且有效。这是否意味着它是一种类方法(我想是这样)?该方法之前是“未找到”因为我只能在类的实际实例上调用这样的方法吗?如果我希望它是一个实例方法,那么它的语法是什么?我想更好地理解Ruby,类和方法。

4 个答案:

答案 0 :(得分:5)

类方法只是:在类上调用。而在该类的实例上调用实例方法。一个例子更有用:

class Foo
  def self.bar
    "This is a class method!"
  end

  def bar
    "This is an instance method!"
  end
end

Foo.bar        # => "This is a class method!"
foo = Foo.new  # This creates "foo" to be a new instance of Foo
foo.bar        # => "This is an instance method!"

请注意,Ruby中的“类方法”实际上是类对象的单例上的方法。这是一个相当难以解释的概念,如果您愿意,可以read more about it

答案 1 :(得分:0)

是的,你完全正确。目前,您定义它的方式,您可以使用以下方法评估方法:

PrimeChecker.new.print_em

def self.my_awesome_method在课堂上定义它的原因是因为

中的内容
class MyAwesomeClass
end

正在MyAwesomeClass的上下文中执行。正如你所看到的,这都是Ruby代码!这使您可以执行以下操作:

class MyAwesomeClass
  puts "Hello from innards of #{self}!" #=> Hello from the innards of MyAwesomeClass!
end

方法定义也只有在> 定义位置后调用时才有效,例如:

class MyAwesomeClass
  my_awesome_method   # produces a nasty error
  def self.my_awesome_method
    puts "Hello world"
  end
  my_awesome_method   # executes just fine
end

希望这能解决一些问题。

答案 2 :(得分:0)

不是写的类方法;您需要使用PrimeChecker

的实例运行它
pc = PrimeChecker.new
pc.print_em

使用self.将其转换为类方法,可以使用您显示的语法运行。

答案 3 :(得分:0)

问:当我运行ruby.rb时,我得到了未定义的方法'print_em'。我将方法更改为self.print_em并且它可以工作。这是否意味着它是一种类方法(我想是这样)。

答:是的。 class Bar; ... def self.foo为类Bar定义了一个类方法foo。

问:之前的方法是“未找到”,因为我只能在类的实际实例上调用这样的方法吗?

答:您首先将其定义为实例方法。在这种情况下,它仅适用于该类的实例。

问:如果我希望它是一个实例方法,那么它的语法是什么?

答:你原来的方式:class Bar; def foo为类Bar定义实例方法foo