Ruby 不作为变量传递
我有两个函数,每个函数都从数组中提取项,同时询问是否存在某个值。我如何创建一个可以根据我是否询问值是否存在而翻转的方法?这个下面是我想作为变量传递的内容Ruby 不作为变量传递,ruby,Ruby,我有两个函数,每个函数都从数组中提取项,同时询问是否存在某个值。我如何创建一个可以根据我是否询问值是否存在而翻转的方法?这个下面是我想作为变量传递的内容 ary.select{ |item| (!)item.my_value.nil? } 有没有可能传递not to作为变量,有点像将某物乘以x,其中x可以是1或-1?如果您有一个名为presence的函数?检查项目是否存在时返回true,检查项目是否不存在时返回false: ary.select{ |item| !!item.my_value
ary.select{ |item| (!)item.my_value.nil? }
有没有可能传递not to作为变量,有点像将某物乘以x,其中x可以是1或-1?如果您有一个名为presence的函数?检查项目是否存在时返回true,检查项目是否不存在时返回false:
ary.select{ |item| !!item.my_value == presence? }
或者作为传递布尔值的方法:
def get_value_presence(boolean presence?)
ary.select{ |item| !!item.my_value == presence? }
end
我假设这是一般性的,您想知道如何传递可以在函数实现中使用的东西来反转它。两种战略: Ruby元编程。您可以使用BasicObject!和目标本身: true 假,假=>真 false,true=>false 真,假=>假 很明显,这就留下了问题。平等。因此:
def values_from(array, switcher)
array.select { |item| item.nil? == switcher }
end
array = [1, nil, :b, nil, nil, 'foo']
values_from(array, true) # => [nil, nil, nil]
values_from(array, false) # => [1, :b, "foo"]
将真与假分开——这就是为什么:
解决了如何使用Ruby元编程实现这一点,但我希望有更优雅的东西,所以我最终通过使用RoR初始值设定项添加到TrueClass和FalseClass来解决这个问题
class TrueClass
def *(value)
!!value
end
end
class FalseClass
def *(value)
!value
end
end
所以我可以做下面的事情,感觉更自然一点
def select_from_ary(present)
ary.select{ |item| present * item.my_value.nil? }
end
类似于ari.reject{| item | item.my_value.nil?}的东西?如果不是的话,我就不明白你的问题了:那仍然需要我有两个基本上做相同事情的函数。我想用一个函数,它的用途可以颠倒。然后var='!';ary.select{| item | item.my_value.nil?.public_sendvar}就是你想要的..这基本上就是我想要的,但我希望Ruby有一种优雅的方式来处理它。我认为select和reject是做同样事情的更可读的版本。他说:“我会避免不必要的把戏,这些把戏可能会让未来的代码维护者感到困惑。我不想使用元编程。”他一边用猴子修补布尔类。xd顺便说一句,我喜欢你的想法,但我会用这种方法创建自己的对象并传递它们,而不是猴子补丁。同意,我对猴子补丁感觉不太好。
class TrueClass
def *(value)
!!value
end
end
class FalseClass
def *(value)
!value
end
end
def select_from_ary(present)
ary.select{ |item| present * item.my_value.nil? }
end