ruby-on-rails - 包含模块如何在课堂内外工作
问题描述
在 Ruby 或 Rails 中,为什么“包含”有时在类内,有时在类外?
我已经研究过上面的内容,但我无法理解的一件事是顶级include
(即在类主体之外)如何将实例方法转换为类方法:
例如:
module Human
def living
true
end
end
include Human
现在根据上面链接问题的答案,这include
使得方法Human
可以从所有文件中访问(如果我错了,请纠正我)。
但是,既然定义为实例方法,为什么我可以将方法作为类方法访问呢?living
Human.living
#=> true
解决方案
从另一个答案:
任何类定义之外
include Foo
都会添加Foo
到Object
. [...] 的所有Foo
实例方法现在随处可用。
通过在顶层包含一个模块,您实际上是在说:
Object.include(Human)
# or
class Object
include Human
end
您缺少的是模块和类也是对象。
对象响应的方法来自其祖先,例如:
1.0.class.ancestors
#=> [Float, Numeric, Comparable, Object, Kernel, BasicObject]
'abc'.class.ancestors
#=> [String, Comparable, Object, Kernel, BasicObject]
或者,对于您的模块:
Human.class.ancestors
#=> [Module, Object, Kernel, BasicObject]
当您include Human
处于顶层时,它会将该模块添加到每个对象的祖先:
include Human
1.0.class.ancestors
#=> [Float, Numeric, Comparable, Object, Human, Kernel, BasicObject]
# ^^^^^
'abc'.class.ancestors
#=> [String, Comparable, Object, Human, Kernel, BasicObject]
# ^^^^^
Human.class.ancestors
#=> [Module, Object, Human, Kernel, BasicObject]
# ^^^^^
一些例子:
1.0.living #=> true
'abc'.living #=> true
Float.living #=> true
Human.living #=> true
推荐阅读
- vba - 如何使用 VBScript 或 VBA 实现以下场景?
- php - 服务器上的 PHPMailer smtp 连接失败
- php - 如何在将图像上传到服务器之前将base64图像的大小调整为具有相同图像质量的固定宽度和高度
- sonarqube - SonarScanner 错误:“您必须安装支持语言 vb 的插件”
- c++ - 如何自己注册“quartz.dll”?
- c++ - extern "C" 默认参数是否有效?
- typescript - 每当我尝试构建 ionic3 时,它都会出现“自定义组件错误”
- macos - 在现代 Mac 上使用 X11::GUITest
- javascript - 量角器点击包装 p-dropdown - 选择值 - 元素在点 (x, y) 处不可点击 其他元素将收到点击
- android - NdsManager Android 错误