如果 Ruby 中的变量等于特定值,优雅地更改变量的方法

3
我正在寻找一种更优雅的方法来完成这个任务:
my_var = nil if my_var == 2

目前我必须重复两次my_var,这看起来不太好。

如果my_var是来自哈希表的键,则变得更加丑陋:

my_hash[:my_key] = nil if my_hash[:my_key] == 12

如果我只想在它已经为nil的情况下才更改它,我可以这样做:
my_var ||= 2

这样做更加简洁。

如果一个变量等于某个值,有更好的方法改变它的值吗?


2
我能理解你的关切。我认为大多数人都会同意 my_var = nil if my_var == 2 这句代码几乎和盛开的郁金香田一样难看。变量的值只能通过赋值来改变,所以为了实现所需结果而不重复 my_var,需要编写 if xxxx; my_var = nil; end 或者 my_var = yyyy,其中表达式 xxxxyyyy 不能包含对 my_var 的引用。如果可以使用 缩写赋值 (x o= ..., 其中 o=+=|= 等符号的占位符) 来完成任务,那就更好了,但我不认为… - Cary Swoveland
...它可能做到(但证明这一点是另一回事),我非常怀疑结果会比它所替换的更丑陋。 - Cary Swoveland
1个回答

1

听起来你想使用哨兵值来代表nil值。

以下是一种方法,可能并不完全适合你的情况。首先,定义一个函数,根据你选择的哨兵值生成你的nilifier:

def make_nilifier sentinel
  -> (var) { var == sentinel ? nil : var }
end

在您的第一个示例中,哨兵值为2:
nilifier = make_nilifier 2

然后,您可以通过调用 nilifier 来为 my_var 赋值:

> my_var = nilifier.call 1
> my_var
=> 1

> my_var = nilifier.call 2
> my_var
=> nil

在您的情况下,您正在检查已经设置的值——这提供了一种在分配时检查值的方法。再次说明,它可能并不完全适合,但可能会对有用的东西提供一些想法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接