小编fra*_*anz的帖子

在hash参数上迭代调用self.send以初始化()

我正在尝试理解以下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)

ruby

18
推荐指数
1
解决办法
9568
查看次数

"base.send:include,InstanceMethods"--->这是做什么的?

我正在看一个模块X,它包含两个名为" InstanceMethods"和" ClassMethods"的模块.

模块X中的最后一个定义是:

  def self.included(base)
    base.send :include, InstanceMethods
    base.send :extend,  ClassMethods
  end
Run Code Online (Sandbox Code Playgroud)

这是做什么的?

ruby

11
推荐指数
1
解决办法
6588
查看次数

self.class.delete是否调用类方法?

我在Ruby库中查看此代码.

我在假设正确self.class.delete调用类的方法称为delete当前对象-即通过引用的对象self.

def delete!
  self.class.delete(self.key)
end
Run Code Online (Sandbox Code Playgroud)

ruby

4
推荐指数
1
解决办法
1377
查看次数

self.class_eval << DEF ... DEF

我正试图理解这个功能.

我能看到的是属性和类型被传递给opal()方法.

然后type_name需要从它的值type,只要type是一个SymbolString.否则,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

2
推荐指数
1
解决办法
910
查看次数

标签 统计

ruby ×4