我知道这是命名空间的事情......任何人都可以给我一些示例代码......我用示例代码快速理解事情......谢谢!
答案 0 :(得分:5)
ruby中的模块可以用于3种可能的事情
这很简单。
module Foo
class Bar
end
end
f = Foo::Bar.new
有时候,你会有一些不适合任何课程的功能。在类似java的东西中,你只需将它们作为一组静态方法放在类上。在ruby中,你会将它们放在一个模块上,因为将它们放在一个类上就意味着该类是为了实现它的
module FooHelper
def self.bar
puts 'hi'
end
end
FooHelper.bar # => hi
这是最难理解的所有3.基本上,它是对C中的多重继承或java中的接口的回答。
有时你的逻辑属于几个类,但同时又不适合作为父类。 mixin描述了将模块方法“混合”到一个类中。实际上还有更多,但在极高的水平,它看起来像这样
module CanFoo
def foo
puts 'bar'
end
end
class Baz
include CanFoo
end
class Bar
include CanFoo
end
baz.new.foo # => bar
bar.new.foo # => bar
mixins是一个相当高级的主题,它需要一些时间来理解何时使用超级类。 IMO它们是ruby最酷的功能之一,它处理多重继承问题,比我看过的任何其他OO语言都更加优雅。
答案 1 :(得分:1)
模块是命名空间内的常量,类和函数的集合。这是一个例子:
module Payments
CARD_TYPES = ["visa", "mastercard"]
class CreditCard
attr_accessor :number
attr_accessor :type
end
extend self
def process_payment
...
end
end
我现在有一个付款模块。我可以调用Payments :: CARD_TYPES来获取数组;付款:: CreditCard.new创建一个对象和Payments :: process_payment来调用一个函数。