gpt4 book ai didi

ruby - alias_method 如何不创建无限循环?

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:02 26 4
gpt4 key购买 nike

我对 alias_method 感到困惑.下面的示例似乎应该产生一个无限循环,但实际上并没有:

  class ApplicationController
dual_accessor :filter_by, :default => []
end

class Class
def dual_accessor(*attributes)
options = attributes.extract_options!
attributes.each do |attribute|
class_eval <<-ruby
class_inheritable_accessor :#{attribute}

singleton_class.send :alias_method, :read_#{attribute}, :#{attribute}

def self.#{attribute}(value = :__read__)
if value == :__read__
read_#{attribute}
else
self.#{attribute} = value
end
end
ruby
self.send(attribute, options[:default]) if options[:default]
end
end
end

据我了解,

  • 我们将散列 { default: [] } 提取到 options 局部变量中。
  • 然后我们遍历 splatted 数组。在这种情况下,splat 仅包含 :filter_by
  • 我们使用 class_eval 在类对象的上下文中评估 heredoc 中的字符串。
  • 我们在self的单例对象上调用alias_method,(self指的是类的一个实例)。
  • 我们创建了一个名为 read_filter_byfilter_by 的新副本。
  • 然后我们创建一个名为filter_by的类方法,它接受一个默认参数:__ read __
  • 休息是不言自明的。

当我们调用 read_#{attribute} 时,例如read_filter_by,这怎么不造成无限循环呢?看起来该方法会一遍又一遍地递归地调用自己。

最佳答案

read_filter_by 调用使用 class_inheritable_accessor 创建的访问器方法。

重要的是 read_filter_by 方法指向调用 alias_methodfilter_by 的内容 - filter_by< 的后续重新定义 不影响 read_filter_by

关于ruby - alias_method 如何不创建无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28728016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com