我正在尝试理解以下Ruby代码.
它看起来像是attrs一个散列,它作为参数传递,默认值为空散列.
然后attrs.each迭代hash(|k,v|)中的键值对.
通过self.send在此迭代期间调用键值对的元素可以获得什么效果?
def initialize(attrs = {}, *args)
super(*args)
attrs.each do |k,v|
self.send "#{k}=", v
end
end
Run Code Online (Sandbox Code Playgroud) 我正在看一个模块X,它包含两个名为" InstanceMethods"和" ClassMethods"的模块.
模块X中的最后一个定义是:
def self.included(base)
base.send :include, InstanceMethods
base.send :extend, ClassMethods
end
Run Code Online (Sandbox Code Playgroud)
这是做什么的?
我在Ruby库中查看此代码.
我在假设正确self.class.delete调用类的方法称为delete当前对象-即通过引用的对象self.
def delete!
self.class.delete(self.key)
end
Run Code Online (Sandbox Code Playgroud) 我正试图理解这个功能.
我能看到的是属性和类型被传递给opal()方法.
然后type_name需要从它的值type,只要type是一个Symbol或String.否则,name调用该方法type.我想这个name方法类似于class获取type参数类的方法.
在self.class_eval我有点迷失但我的猜测是这可能是一个代码块,可能会被添加到引用的类中self.
这怎么工作我不确定.
如果有人能解释之后发生了什么,我将不胜感激self.class_eval << DEF.
def opal(attr, type)
self.ds "#{attr}_id"
type_name = (type.is_a?(Symbol) || type.is_a?(String)) ? type : type.name
self.class_eval <<DEF
def #{attr}
if defined?(@#{attr})
@#{attr}
else
@#{attr} = if self.#{attr}_id
#{type_name}.get(self.#{attr}_id)
else
nil
end
end
end
def #{attr}=(value)
self.#{attr}_id = value.key
@#{attr} = value
end
DEF
end
Run Code Online (Sandbox Code Playgroud) ruby ×4