Rubyを学びながら単純なPiGeneratorに取り組んでいましたが、RubyMine 6.3.3でNoMethodErrorが発生し続けたため、できるだけ単純な新しいプロジェクトと新しいクラスを作成することにしました。[〜#〜 ] still [〜#〜] NoMethodErrorを取得します。何らかの理由?
class Methods
def hello (player)
print "Hello, " << player
end
hello ("Annie")
end
そして、私が得るエラーは次のとおりです。
C:/Users/Annie the Eagle/Documents/Coding/Ruby/Learning Environment/methods.rb:5:in `<class:Methods>': undefined method `hello' for Methods:Class (NoMethodError)
インスタンスメソッドを定義し、それをクラスのメソッドとして呼び出そうとしています。したがって、メソッドhello
を、クラスMethods
のインスタンスメソッドではなく、クラスメソッドにする必要があります。
class Methods
def self.hello(player)
print "Hello, " << player
end
hello("Annie")
end
または、それをインスタンスメソッドとして定義する場合は、次のように呼び出します。
class Methods
def hello(player)
print "Hello, " << player
end
end
Methods.new.hello("Annie")
インスタンスメソッドをクラスメソッドとして呼び出そうとしています。
Rubyの2つの違いを説明するコードを次に示します。
class Person
# This is a class method - note it's prefixed by self
# (which in this context refers to the Person class)
def self.species
puts 'Human'
# Note: species is OK as a class method because it's the same
# for all instances of the person class - ie, 'Bob', 'Mary',
# 'Peggy-Sue', and whoever else, are ALL Human.
end
# The methods below aren't prefixed with self., and are
# therefore instance methods
# This is the construct, called automatically when
# a new object is created
def initialize(name)
# @name is an instance variable
@name = name
end
def say_hello
puts "Hello from #{@name}"
end
end
そして今、メソッドを呼び出して試してみてください...
# Call a class method...
# We're not referring to any one 'instance' of Person,
Person.species #=> 'Human'
# Create an instance
bob = Person.new('Bob')
# Call a method on the 'Bob' instance
bob.say_hello #=> 'Hello from Bob'
# Call a method on the Person class, going through the bob instance
bob.class.species #=> 'Human'
# Try to call the class method directly on the instance
bob.species #=> NoMethodError
# Try to call the instance method on the class
# (this is the error you are getting)
Person.say_hello #=> NoMethodError
インスタンスメソッドを作成しましたが、クラスメソッドを呼び出しています。 hello("Annie")
を呼び出すには、メソッドのインスタンスを作成する必要があります。例えば:
class Methods
def self.hello(player)
print "Hello, " << player
end
end
my_method = Methods.new
my_method.hello("Annie")
これはHello, Annie
を出力します
def method_name argsでメソッドを定義することにより、そのクラスのすべてのオブジェクトに含まれるが、クラス自体には含まれないインスタンスメソッドを定義します。
一方、def self.method_name argsを使用すると、オブジェクトをインスタンス化する必要なしに、クラスに直接含まれるクラスメソッドを取得できます。
だからあなたがこれを持っているなら:
Class Test
def self.bar
end
def foo
end
end
インスタンスメソッドは次のように実行できます。
a = Test.new
a.foo
そして、クラスに関しては、次のようになります。
Test.foo