我正在寻找能够执行以下操作的功能:
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
级别),这不是标准的,我失去了编写干净代码的好处。
答案 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中执行检查。这样可以提供更好的性能。