我对此非常困惑。 在编程Ruby书中,它说,“接收器在自己的类中检查方法定义”

所以类对象存储所有实例方法。 那为什么我不能从类中调用实例方法呢?

例如

Class ExampleClass
  def example_method    
  end
  example_method
end

我不能在ExampleClass中调用example_method。

但是,如果我在顶层定义一个方法,如下所示:

class ExampleClass
  def example_method
  end
end

def example_method1
end

example_method1

然后我可以调用顶级方法example_method1。

顶级也不是一流的吗? 为什么它与ExampleClass中的调用实例方法不同?

#1楼 票数:4

你不能以你编写的方式调用该函数的最大原因是,正如你所说的那样,它是一个实例方法。

尝试以这种方式定义它:

class ExampleClass
  def self.class_method
    puts "I'm a class method"
  end
  class_method
end

我相信你会发现你有不同的结果。 这并不是它的“顶级”,而是它是否适合您所处理的范围。 由于您正在处理类,因此需要使用类方法。 如果你正在处理一个对象(一个实例化的类),它就是一个不同的“范围”。

#2楼 票数:2

那些“全球”方法是个例外。 它们被定义为Object的私有实例方法。 一切都从Object继承,因此这些方法是“全局”可见的。

p self.class # => Object
p self.private_methods.sort # => [:Array, :Complex, ... :using, :warn] # all (?) from Kernel module

def aaaa
end

p self.private_methods.sort # => [:aaaa, :Array,  ... :using, :warn]

#3楼 票数:2

我将尝试解释如下。

class MyClass
  def self.my_method
    puts "Me, I'm a class method. Note that self = #{self}"  
  end

  def my_method
    puts "Me, I'm an instance method. Note that self = #{self}"
  end

  # I'm about to invoke :my_method on self. Which one will it be?"
  # "That depends on what self is now, of course.

  puts "self = #{self}"

  # OK. It's MyClass. But wait. I'm just defining the set now.
  # Do the methods I defined above even exist yet?
  # Does the class exist yet? Let's find out.

  print "class methods: "
  puts self.methods(false)
  print "instance methods: "
  puts self.instance_methods(false)

  # Cool! Let's try invoking my_method

  my_method

  # It worked. It was the class method because self = MyClass

  # Now let's see if we can create an instance of the class before
  # we finish defining the class. Surely we can't.

  my_instance = new
  puts "my_instance = #{my_instance}"

  # We can! Now that's very interesting. Can we invoke the
  # instance method on that instance?

  my_instance.my_method

  # Yes!
end

在定义类时打印以下内容:

self = MyClass
class methods: my_method
instance methods: my_method
Me, I'm a class method. Note that self = MyClass
my_instance = #<MyClass:0x007fd6119125a0>
Me, I'm an instance method. Note that self = #<MyClass:0x007fd6119125a0>

现在让我们确认可以从类外部调用方法。 这里应该没有意外:

MyClass.my_method
  #-> Me, I'm a class method. Note that self = MyClass
my_instance = MyClass.new
my_instance.my_method
  #-> Me, I'm an instance method. Note that self = #<MyClass:0x007fd61181d668>

#4楼 票数:2

接收器在其自己的类中检查方法定义。 接收器是ExampleClass ExampleClassClassClass Class类中没有example_method方法,你会得到一个NoMethodError

  ask by meizin translate from so

未解决问题?本站智能推荐:

3回复

从Ruby中的实例方法调用继承的类方法

我有以下Ruby代码: 它试图证明受保护的类方法是在Ruby中继承的。 问题是,如果我将met方法转换为这样的实例方法: 它不会工作。 也许与类和实例方法的作用域有关?
3回复

从Ruby中的实例方法调用受保护的类方法

我一直在重复这个烦人的主题。 假设我有一个定义实例方法和受保护的类方法的类。 实例方法必须调用类方法。 为此,我必须打破可见性规则并使用危险的“发送”功能。 像这样: 我发现这很糟糕,因为应该在类范围内使用类方法,因此应该在其中保持可见和可调用,对吗? 有没有其他方法可以在实例
1回复

实例方法中的Ruby调用类方法

从实例方法调用类方法的语法是什么? 假设我有以下内容 当我运行此代码时,我没有输出。
3回复

从Ruby中的类方法调用私有实例方法

我可以创建一个可以通过类方法调用的私有实例方法吗? 抱歉,如果这是一个非常基本的问题,但我无法以谷歌的方式找到解决方案。
1回复

如何在Ruby中调用类的所有实例方法?

我目前正在努力将自己的小测试方法运行器脚本放在一起。 我需要某种方法来调用类中的所有方法。 当我调用run_tests方法时,我的程序陷入了无限循环。 是什么原因造成的,有什么解决方案?
3回复

为什么要在Ruby中的类上调用实例方法?

我想知道这样做的原因是什么,还是某人犯了一个愚蠢的错误(或者是我不理解的其他事情)。 在代码中的其他位置调用此方法,如下所示
2回复

Ruby:如何从模块中调用类的实例方法?

我在类上定义了一个实例方法: 我想在一个模块中调用此方法: 这给了我以下错误: 我知道我可以写 但我想知道模块是否有办法访问当前实例?
1回复

ruby - 如何在模块中动态调用实例方法

我正在尝试动态调用实例方法。 我发现send , call , eval这样做。 有动态调用类方法的例子,但我还没有弄清楚如何让它适用于实例方法。 例如 实例方法名称可以列出: 但我无法弄清楚如何调用该方法: 如何通过方法名称调用实例方法,如Foo ?