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
这意味着生成了五种方法,它们使用来自自身的一些数据以及count
和user_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 中的 TkRoot 上设置 WM_CLASS