为什么这个Ruby方法需要成为一个类级别的方法?
这里是一个典型的fizzbuzz在Ruby中:为什么这个Ruby方法需要成为一个类级别的方法?
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
当我执行此,我得到这个错误:
undefined method 'print_em'.
我改变方法self.print_em
和它的作品。这是否意味着它是一个类方法(我认为是这样)?之前是“找不到”的方法,因为我只能在类的实际实例上调用这样的方法?如果我希望它成为实例方法,那么它的语法是什么?我试图更好地理解Ruby,类和方法。
类方法就是这样:在类上调用。而实例方法是,该类别的实例是。一个例子更有用:请注意,Ruby中的“类方法”实际上是类对象的单例中的方法。这是一个很难解释的概念,如果你愿意,你可以read more about it。
是的,你是完全正确的。目前,您定义的方式,你可以评估与方法:
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
希望这将清除一些东西了。
这是不是写成的类方法;你需要用的PrimeChecker
一个实例中运行它:
pc = PrimeChecker.new
pc.print_em
使用self.
把它变成一个类的方法,可运行与你展示的语法。
它不需要需要是一个类方法,它只是这就是你如何执行它。
问:当我运行ruby.rb时,我得到了未定义的方法'print_em'。我将该方法更改为self.print_em,它可以工作。这是否意味着它是一种类方法(我认为是这样)。 A:是的。 class Bar; ... def self.foo
为类Bar定义了一个类方法foo。
问:以前的方法“找不到”,因为我只能在类的实际实例上调用这样的方法吗?
答:您首先将其定义为实例方法。在这种情况下,它仅适用于该类的实例。
问:如果我希望它成为一个实例方法,那么它的语法是什么?
答:你有它原始的方法:class Bar; def foo
定义例如方法foo类酒吧
大,它还挺我的想法。接受并且还为示例+1。谢谢! – junky 2012-02-28 16:50:40
woops对不起,我没有15代表所以不能upvote。但我确实接受。 – junky 2012-02-28 16:51:12
丁!现在在15代表。给了upvote! – junky 2012-02-28 16:51:42