ruby:如果test为true则返回对象

时间:2018-02-22 18:41:09

标签: ruby functional-programming

我正在寻找能够执行以下操作的功能:

def self.my_find
  object = self.first #Whatever
  return object.my_check? ? object : nil
end

类似于check

object.check(&:my_check?)

它应该存在,不应该吗?

这是我的情况:

在方法(控制器)中,我有一些nil个能够对象,我需要检查对象上的某些内容以进一步使用它。

如果尝试编写伪功能代码,逻辑首先检索对象,然后对对象进行操作,然后返回对象。

如果我有一个集合,代码将是:

result = get_my_collection_method.select(&:my_check?).map(&:my_action)

如果select方法过滤所有对象,则result将等于[]但代码仍然有效,则没有问题。

即使它不是一个集合而是一个单一的对象,我觉得自然也想做同样的事情:

result = get_my_object.check(&:my_check?).try(:my_action)

但是这个方法不存在的事实告诉我在ruby中对象和数组之间没有monadic转换。

我想最简单的方法是将单例转换为单值数组:

result = Array(get_my_object).select(&:my_check?).map(&:my_action).first

我希望这澄清为什么我正在寻找这样的方法。

但问题仍然存在:它本身存在吗?如果我自己编写(即使在Object级别),这不是标准的,我失去了编写干净代码的好处。

2 个答案:

答案 0 :(得分:0)

虽然这种方法在您的特定情况下似乎有用,但这类事情通常表达如下:

object = self.first
object.my_check? and object

如果理解这个方法可能会返回false,但这不是一个逻辑真值,所以没关系。

如果你想为Object编写自己的方法,那么欢迎你,但请记住,你的代码越是深奥和古怪,其他人就越难以参与其中。当你忘记了不寻常的核心扩展时,那些“其他人”将来可能是你。

答案 1 :(得分:0)

以下是一些方法:

def self.my_find
  object = self.first # Whatever

  # Use ONE of the following examples:

  # 1.
  object if object.my_check?

  # 2.
  object.my_check? && object

  # 3.
  object.my_check? ? object : nil
end

请注意,在ruby中的方法结尾处不需要显式的return

虽然取决于上下文(我只能推测,因为没有给出!),可能是一种更简洁的方法。例如,如果这实际上是您在rails应用程序中构建的内容,则其中一个示例会更好:

def self.my_find
  where(...).find_by(my_check: true)

  # Or, where `my_check` is a *SCOPE*!!
  my_check.find_by(...)
end

...主要区别在于您在SQL 中而不是在ruby中执行检查。这样可以提供更好的性能。