这是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,类和方法。
答案 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