ruby 中的 class << self 及其方法

Posted

技术标签:

【中文标题】ruby 中的 class << self 及其方法【英文标题】:class << self in ruby and its methods 【发布时间】:2022-01-16 15:50:49 【问题描述】:

我有一个带有以下代码的 ruby​​ on rails 模型,它使用单格顿类定义。此外,还有一些元编程逻辑。但是,我不明白这段代码什么时候会调用。是在编辑下面指定的属性时吗?

class Product < ApplicationRecord

    class << self
      ['cat_no', 'effort', 'impact', 'effect', 'feedback'].each do |attr| 
        define_method "update_#attr" do |pr, count, user_id|
           pr.order=pr.cat_no     
           pr.idea=pr.description
           pr.update("#attr"=>count,:last_modified_by=>user_id)
        end
      end
    end
end

请帮忙。 谢谢

【问题讨论】:

方法应该是实例方法。 (pr 是实例) 【参考方案1】:

此代码生成五个方法,一个用于列表中的每个属性名称。所有这些生成的方法都采用三个参数,基本上看起来像这样(我以impact 属性名称为例):

def self.update_impact(pr, count, user_id)
  pr.order = pr.cat_no     
  pr.idea = pr.description
  pr.update("impact" => count, :last_modified_by => user_id)
end

这意味着生成了五种方法,它们使用来自自身的一些数据以及countuser_id 更新传入的pr

请注意,此方法仅处理特定的pr,因此使用实例而不是类方法当然更好,正如 Stefan 在他的评论中所建议的那样。而且 IMO 在这里元编程并没有真正的好处。我会将逻辑更改为

def update_count(type, count, user_id) # or any another name that makes sense in the domain
  if type.in?(%i[cat_no effort impact effect feedback])
    update(
      :order => cat_no, 
      :idea => description, 
      :last_modified_by => user_id, 
      type => count
    )
  else
    raise ArgumentError, "unsupported type '#type'"
  end
end

并调用它而不是

Model.update_impact(pr, count, user_id)

喜欢这个

pr.update_count(:impact, count, user_id)

【讨论】:

好答案。我真的会在这里使用关键字参数,因为参数没有自然顺序,所以很难记住它实际上做了什么。

以上是关于ruby 中的 class << self 及其方法的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:class << self 做啥? [复制]

Ruby类问题[重复]

在 ruby​​ 中创建匿名类

如何在 ruby​​ 中的 TkRoot 上设置 WM_CLASS

Ruby中'self.method_name'和'class << self'之间的区别

Ruby中的案例陈述[重复]