gpt4 book ai didi

ruby - 如何使用 Ruby 的元编程来减少方法数

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

我有一堆重复的方法,我确信我可以以某种方式使用 Ruby 的元编程。

我的类(class)是这样的:

class SomePatterns

def address_key
"..."
end

def user_key
"..."
end

def location_key
"..."
end

def address_count
redis.scard("#{address_key}")
end

def location_count
redis.scard("#{location_key}")
end

def user_count
redis.scard("#{user_key}")
end

end

我在想我只能有一种方法,比如:

def count(prefix)
redis.scard("#{prefix}_key") # wrong, but something like this
end

以上是错误的,但我是说 *_count 方法将遵循一种模式。我希望学习使用元编程来避免重复。

我该怎么做?

最佳答案

我会将所有“函数前缀”放入一个数组中。初始化后,您可以使用 :define_singleton_method在这些前缀上为每个前缀动态创建一个实例方法:

class SomePatterns
def initialize()
prefixes = [:address, :location, :user]
prefixes.each do |prefix|
define_singleton_method("#{prefix}_count") { redis.scard("#{prefix}_key") }
end
end
end

编辑:

:define_singleton_method 实际上可能有点矫枉过正。它会为你想要的工作,但它会为那个特定的实例定义这些函数(因此它被称为单例)。区别很微妙,但很重要。相反,使用 :class_eval 可能会更好连同:define_method .

class SomePatterns
# ...
class_eval do
[:address, :location, :user].each do |prefix|
define_method("#{prefix}_count") { redis.scard("#{prefix}_key") }
end
end
end

关于ruby - 如何使用 Ruby 的元编程来减少方法数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43400344/

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