Ruby混合属性
受datamapper如何使用mixin的启发,我需要了解如何使用mixin复制以下内容Ruby混合属性,ruby,properties,mixins,Ruby,Properties,Mixins,受datamapper如何使用mixin的启发,我需要了解如何使用mixin复制以下内容 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 It
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
非常感谢您的帮助。谢谢。默认情况下,如果
在另一个类中包含属性
,则其他类的实例可以使用所有实例方法作为实例方法
在本例中,您可以在另一个类中使用扩展属性
,这样属性
的实例方法就变成了另一个类的类方法
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属性
,则可以钩住模块的include
方法,并在其中添加必要的方法
module Property
def self.included(clazz)
clazz.define_singleton_method(:property) do |name, type, value|
p [name, type, value]
end
end
end
默认情况下,如果在另一个类中
包含属性
,则其他类的实例可以使用所有实例方法作为实例方法
在本例中,您可以在另一个类中使用扩展属性
,这样属性
的实例方法就变成了另一个类的类方法
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属性
,则可以钩住模块的include
方法,并在其中添加必要的方法
module Property
def self.included(clazz)
clazz.define_singleton_method(:property) do |name, type, value|
p [name, type, value]
end
end
end
所以在关注了Arie的帖子之后,我就是这么做的
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
所以在关注了Arie的帖子之后,我就是这么做的
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
你好,阿里,谢谢你的详细解释。@GavinYap没问题:)你好,阿里,谢谢你的详细解释。@GavinYap没问题:)