gpt4 book ai didi

ruby - 在模块中讨论实例/类方法的约定

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:50 24 4
gpt4 key购买 nike

给定以下代码:

module Foo
class Bar
def some_method
end
def self.another_method
end
end
end

如果我想和 ruby​​ist 谈论实例方法 some_method 我会说 Foo::Bar#some_method
如果我想谈论类方法another_method,我会说Foo::Bar::another_method

但是如果 Bar 是一个模块呢:

module Foo
module Bar
def some_method
end
def self.another_method
end
end
end

约定是否相同?

最佳答案

是的。

虽然术语不同,类有方法,但对于模块,它们有时被称为函数。

我的资料来源是 Matz 的“Ruby in a Nutshell”一书。他将在模块上定义的方法称为模块函数,因此也是 Module.module_function 方法的名称。同一本书有一章介绍 exit 等内置函数,它们是在 Kernel 模块上定义的。

有趣的是,这些“函数”似乎是全局可用的,因为 Object 包含 Kernel,因此它的所有模块函数都成为任何对象的私有(private)方法,因此可以从任何上下文调用.期待 BasicObject 但那是另一回事了。


或者按照 Eric 的建议“问 Ruby”

[1] pry(main)> module B
[1] pry(main)* def m
[1] pry(main)* end
[1] pry(main)* def self.n
[1] pry(main)* end
[1] pry(main)* module_function
[1] pry(main)* def f
[1] pry(main)* end
[1] pry(main)* end
=> nil
[2] pry(main)> B.instance_method(:m)
=> #<UnboundMethod: B#m>
[3] pry(main)> B.method(:n)
=> #<Method: B.n>
[4] pry(main)> B.method(:f)
=> #<Method: B.f>

三个观察

  • 模块函数与模块上的“类方法”相同
  • 模块上的“类方法”打印为 Module.fun
  • 模块上的“实例方法”实际上是未绑定(bind)的。

关于ruby - 在模块中讨论实例/类方法的约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41473195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com