gpt4 book ai didi

ruby - 有没有办法在 ruby​​ 中重新定义 []=+

转载 作者:IT王子 更新时间:2023-10-29 06:00:36 27 4
gpt4 key购买 nike

我正在尝试编写一个简单的 DSL(针对 Redis)并且我想自己定义 []+=

我有

def []=(key,val)
@redis.zadd(@name,val,key)
end

我想定义

def []+=(key,val)
@redis.zincrby(@name,val,key)
end

但我的理解是,Ruby 提供了“[]+=”运算符自动给定 []=

有没有办法克服这种行为显然我不想要这个,因为我不能,比如说,在管道模式下运行它

最佳答案

不,<operator>=不能在 Ruby 中重新定义。

您可以尝试变得非常花哨,并将您的返回值包装在委托(delegate)给实际值的类中。这样,它们的行为就像实际值一样,但您可以玩一些把戏,例如 + .

这是一个简单的例子:

require 'delegate'
module Redis
class Set
class Value < SimpleDelegator
def +(val)
Increment.new(self, val)
end
end

class Increment < SimpleDelegator
attr_reader :increment
def initialize(source, increment)
super(source.__getobj__ + increment)
@increment = increment
end
end

def [](key)
Value.new(@redis.not_sure_what(@name, key))
end

def []=(key,val)
if val.is_a?(Increment)
@redis.zincrby(@name,val.increment,key)
else
@redis.zadd(@name,val,key)
end
end
end
end

这只是一个起点。你必须比这更小心,例如检查 key 是否相同。在我的简单示例中,redis[:foo] = redis[:bar] + 1实际上相当于 redis[:foo] += 1 ...

关于ruby - 有没有办法在 ruby​​ 中重新定义 []=+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11058637/

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