Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 不作为变量传递_Ruby - Fatal编程技术网

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