ruby声明式语法的实现代码
在ActiveRecord可以用很方便的声明方式来定义model之间的关联关系,例如:
class Topic < ActiveRecord::Base
has_many :posts
belongs_to :user
end
has_many和belongs_to其实是Topic类的class method,标准写法是:
class Topic < ActiveRecord::Base
_many(:posts)
ngs_to(:user)
end
那么has_many可以给我们带来什么呢?类方法has_many在被执行的时候,给Topic的对象实例添加了一系列方法:posts, posts<<, ......等等。所以当我们在model里面声明has_many,belongs_to等对象关系的时候,一系列相关的对象方法就被自动添加进来了。 让我们来自己试试看吧:
复制代码 代码如下:
module M
def uded(c)
nd(G)
end
module G
def generate_method(*args)
do |method_name|
define_method(method_name) { puts method_name }
end
end
end
end
class C
include M
generate_method :method1, :method2
end
c =
od1
od2
我们定义了一个声明generate_method,可以接受多个symbol,来动态的创建同名的方法。现在我们在类C里面使用这个声明:generate_method :method1, :method2,当然我们需要include模块M。为什么ActiveRecord的model不需要include相关的模块呢?当然是因为Topic的父类ActiveRecord::Base已经include了模块Associations了。
类C通过include模块M,调用了模块M的一个included回调接口,让类C去extend模块G,换句话来说就是,通过include模块M,来给类C动态添加一个类方法generate_method。
这个generate_method被定义在模块G当中,它接受一系列参数,来动态创建相关的方法。于是我们就实现了这样的`DSL功能:
通过在类C里面声明generate_method :method1, :method2,让类C动态的添加了两个实例方法method1,method2,是不是很有意思? 实际上rails的对象关联声明也是以同样的方式实现的。
-
员工离职声明(13篇)
员工离职声明1尊敬的客户:您好!感谢您在此前一直对本公司的信任与支持,由于本公司业务人员的人事变动给您带来的不便,尽请谅解。原公司业务员xxx与公司于20xx年x月x日正式离职,与公司解除劳动关系。我公司郑重声明:该员工自离职之日起发生的所有业务关系均属个人行...
-
股东放弃股份优先购买权声明
股东放弃股份优先购买权声明1鉴于:________________为有限公司(以下简称“目标公司”)的合法股东之一,并依据公司章程规定持有目标公司百分之一(1%)的'股权。(股权出让方)为目标公司的另一股东。依据公司章程规定合法持有目标公司百分之九十二点五(92.5%)的股权...
-
投标人资格声明范例【15篇】
投标人资格声明1X市D区招投标交易中心:本单位自愿参加“xx项目(招标编号:XZCG20xx—GK—)”的投标,并保证投标文件中所列举的投标报价及相关文件和公司基本情况资料是真实的、合法的`。同意此次采购招标文件中的各项内容。同意提供按照贵方可能要求的与投标有关的...
-
申请离婚登记声明4篇
申请离婚登记声明1我们双方申请离婚登记,谨此声明:男方姓名:_____________国籍:______________出生日期:_____年___月___日民族:____职业:______文化程度:________身份证件号:_____________________常住户口所在地:__________________________________女方姓名:__________...
相关文章
- 火星哥Bruno Mars超经典歌曲《Marry You》歌词现场版视频
- vocabulary是什么意思 vocabulary中文释义-短语-例句
- Justin Bieber《Baby》中英歌词演唱会现场版视频
- Cry On My Shoulder中英双语歌词现场版视频
- 往届中考英语满分作文:Lucky Numbers
- 关于Buying pictures的初三英语作文
- 防弹少年团(BTS)butterfly歌词谐音现场版视频
- 实例讲解Ruby使用设计模式中的装饰器模式的方法参考
- 机器学习和数据挖掘的就业前景如何,实现的话一般用C++还是python,比较擅长java和objc,准ruby程序员
- 中考英语优秀作文范文 Lucky Numbers