相关疑难解决方法(0)

为什么我可以使用诸如puts之类的内核单例方法?

在Ruby中,该方法putsKernel模块的单例方法。

通常,当一个模块是另一个模块的included或extended时,该模块(而不是其单例类)将被添加到继承树中。这有效地使模块的实例方法可用于该模块或其单例类(分别用于includeextend)...但是混合模块的单例方法仍然不可访问,因为模块的单例类不是曾经添加到继承树中。

那为什么要使用puts(和其他内核单例方法)?

Kernel.singleton_methods(false)

# => [:caller_locations, :local_variables, :require, :require_relative, :autoload, :sprintf, :format, :Integer, :Float, :String, :Array, :Hash, :test, :warn, :autoload?, :fork, :binding, :exit, :raise, :fail, :global_variables, :__method__, :__callee__, :__dir__, :URI, :eval, :iterator?, :block_given?, :catch, :throw, :loop, :gets, :sleep, :proc, :lambda, :trace_var, :untrace_var, :at_exit, :load, :Rational, :select, :Complex, :syscall, :open, :printf, :print, :putc, :puts, :readline, :readlines, :`, :p, :system, :spawn, :exec, :exit!, …
Run Code Online (Sandbox Code Playgroud)

ruby eigenclass

6
推荐指数
1
解决办法
86
查看次数

Ruby中类单例方法的方法查找

我的印象是obj.method导致红宝石method如此寻找:

  1. 看看obj单身课.
  2. 查看obj单例类所包含的模块.
  3. 看看obj上课.
  4. 查看obj班级所包含的模块
  5. 在类的超类上重复步骤3和4,直到找到
  6. 如果从未找到,请调用method_missing原始对象obj.

在这个模型下,搜索该方法的唯一单例类是原始接收器的单例类obj.但是,这个模型无法解释子类可以访问其超类的单例方法的事实.例如

class Foo
  def self.foo
    "foo"
  end
end

class Bar < Foo
end

Bar.foo  #=> "foo"
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为我相信这意味着Foo单身类在某些时候搜索了这个方法foo.但是,根据上面的模型,我希望只Bar搜索单例类foo.如果做不到这一点,我希望ruby可以查看Bar类,Class然后继续爬上超类链(Foo完全跳过它的单例类).

所以我的问题是:我对Ruby方法查找的理解缺少什么,这解释了一个类可以访问其超类的单例方法的事实?

ruby

3
推荐指数
1
解决办法
573
查看次数

在Ruby中,术语"元类","本征类"和"单例类"是完全同义和可替代的吗?

Class类的文档有一个令人难以置信的混乱图,涉及"元类".我试图揭开这里实际发生的事情的神秘面纱.这三个词都是......

  • 元类
  • eigenclass
  • 单身课程

Ruby中的同义词?我知道元类在Python中意味着特定和不同的东西,例如,但在Ruby中呢?

ruby

3
推荐指数
1
解决办法
1014
查看次数

标签 统计

ruby ×3

eigenclass ×1