讨论模块中实例/类方法的惯例

时间:2017-01-04 21:03:24

标签: ruby oop

给出以下代码:

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

如果我想与rubyist讨论实例方法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

约定是否相同?

3 个答案:

答案 0 :(得分:0)

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

我的来源是" Ruby in a Nutshell"马茨的书。他将模块上定义的方法称为模块函数,因此也称为Module.module_function方法的名称。同一本书有一章关于内置函数,如exit等,它们在Kernel模块上定义。

有趣的事实,那些"功能"似乎全局可用,因为Object包含Kernel,因此其所有模块函数都成为任何对象的私有方法,因此可以从任何上下文调用。期待BasicObject,但这是另一个故事。

或者"问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>

三个观察

  • 模块功能与&#34;类方法相同&#34;在模块上
  • &#34;课堂方法&#34;在模块上打印为Module.fun
  • &#34;实例方法&#34;在模块上实际上是未绑定的。

答案 1 :(得分:0)

当谈论这段代码时, [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] [Key] 将被称为实例方法Foo::Bar#some_method some_method我会调用类方法Foo::Bar.another_method

在模块的上下文中,我将another_method称为模块方法。而像实例方法之类的东西在模块的上下文中没有意义。您可能想要将其称为函数。

答案 2 :(得分:0)

是的,这是完全相同的惯例,原因很简单: