Ruby 混合 属性
Ruby Mixins Property
受到 datamapper 如何使用 mixins 的启发,我需要了解如何使用 mixins 复制以下内容
module Property
def property(name, type, value)
#Some code
end
end
class Weapon
include Property
property :name, :string, "The legendary Sword"
property :attack, :integer, 10
end
class Item
include Property
property :name, :string, "Magic Carpet"
property :description, :string, "Fly you to the moon"
end
但是我有一个错误,
NoMethodError: undefined method `property' for Route:Class
非常感谢任何帮助。谢谢
默认情况下,如果您 include Property
在另一个 class 中,所有实例方法都可以作为实例方法供其他 class 的实例使用。
在你的例子中,你可以在另一个 class 中使用 extend Property
,所以 Property
的实例方法变成了另一个 class 的 class 方法].
module Property
def property(name, type, value)
#Some code
end
end
class Weapon
extend Property
property :name, :string, "The legendary Sword"
property :attack, :integer, 10
end
或者如果您更喜欢使用 include Property
,您可以挂钩模块的 included
方法,并在那里添加必要的方法。
module Property
def self.included(clazz)
clazz.define_singleton_method(:property) do |name, type, value|
p [name, type, value]
end
end
end
所以在跟随 Arie 的 post 之后,这就是我所做的
module Item
def self.included(item)
item.extend Property
end
end
module Property
def property(name, type, value)
define_method(name) { p [name, type, value] }
end
class Weapon
include Item
property :name, :string, "The legendary Sword"
property :attack, :integer, 10
end
受到 datamapper 如何使用 mixins 的启发,我需要了解如何使用 mixins 复制以下内容
module Property
def property(name, type, value)
#Some code
end
end
class Weapon
include Property
property :name, :string, "The legendary Sword"
property :attack, :integer, 10
end
class Item
include Property
property :name, :string, "Magic Carpet"
property :description, :string, "Fly you to the moon"
end
但是我有一个错误,
NoMethodError: undefined method `property' for Route:Class
非常感谢任何帮助。谢谢
默认情况下,如果您 include Property
在另一个 class 中,所有实例方法都可以作为实例方法供其他 class 的实例使用。
在你的例子中,你可以在另一个 class 中使用 extend Property
,所以 Property
的实例方法变成了另一个 class 的 class 方法].
module Property
def property(name, type, value)
#Some code
end
end
class Weapon
extend Property
property :name, :string, "The legendary Sword"
property :attack, :integer, 10
end
或者如果您更喜欢使用 include Property
,您可以挂钩模块的 included
方法,并在那里添加必要的方法。
module Property
def self.included(clazz)
clazz.define_singleton_method(:property) do |name, type, value|
p [name, type, value]
end
end
end
所以在跟随 Arie 的 post 之后,这就是我所做的
module Item
def self.included(item)
item.extend Property
end
end
module Property
def property(name, type, value)
define_method(name) { p [name, type, value] }
end
class Weapon
include Item
property :name, :string, "The legendary Sword"
property :attack, :integer, 10
end