0

我正在玩模块和类来完成一些事情。

当我在没有任何继承的情况下启动 MyClass 时class MyClass::A4.generate,A4 会覆盖格式功能。

A4 看起来像这样:

class A4 < MyClass
  def somefunction
    format = { :width => 200, :height => 100 }
  end
end

但现在我想在几种格式上创建多个类(生成不同类型的文件)。

我的第一次尝试是,class MyClass < AnotherClass但这更像是在 Ruby 中尝试 Javacode,这就是互联网上很多人所说的。

现在第二次尝试更像 Ruby:

module AnotherModule
 def somefunction
   format = { :width => 50 }
 end
end

class MyClass
  include AnotherModule
  def initialize
  end
  ......
end

这样的事情可能吗?

class A4 < AnotherModule
  def somefunction
    format = { :width => 200, :height => 100 }
  end
end

MyClass::A4.new.generate

如果是这样,怎么做?

4

2 回答 2

2

我不喜欢你的名字,所以从现在开始,让我叫Afile你叫什么MyClass,叫PrintSettings什么AnotherModule

假设你有PrintSettings,A4Afile像这样定义

module PrintSettings
  # stuff
end

module A4
end

class Afile
  include PrintSettings
end

现在,您想要动态包含A4(重要A4的是模块而不是类),您可以在内部某处执行以下操作Afile

extend format

# example:

class Afile
  include PrintSettings

  def format=(new_format)
    extend new_format
  end
end

# and then using like:

file = Afile.new
file.format = A4

所以,总而言之,当你想在定义类时混入一个模块时,你使用include,当你有一个对象,并希望该对象扩展某个模块时,你使用extend.

于 2012-12-27T12:40:37.633 回答
0

如果我正确理解了你的问题,

class A4 < AnotherModule
end

MyClass::A4.new.generate

上面的代码没有按预期运行,因为 A4 类正在扩展一个模块,该模块将所有方法AnotherModule作为 A4 中的静态方法。

如果 generate 是模块 AnotherModule 给出的方法,

`MyClass::A4.generate` will work.

http://railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/

希望这可以帮助。

于 2012-12-27T11:04:07.557 回答