web-dev-qa-db-ja.com

Ruby:NoMethodErrorですが、なぜですか?

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)
7
Annie the Eagle

インスタンスメソッドを定義し、それをクラスのメソッドとして呼び出そうとしています。したがって、メソッド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")
7
Arup Rakshit

インスタンスメソッドをクラスメソッドとして呼び出そうとしています。

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
3
joshua.paling

インスタンスメソッドを作成しましたが、クラスメソッドを呼び出しています。 hello("Annie")を呼び出すには、メソッドのインスタンスを作成する必要があります。例えば:

class Methods
  def self.hello(player)
      print "Hello, " << player
  end
end

my_method = Methods.new
my_method.hello("Annie")

これはHello, Annieを出力します

1
Sara Tibbetts

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
0
sz23