gpt4 book ai didi

ruby - 如果在对象上则保留

转载 作者:太空宇宙 更新时间:2023-11-03 17:10:08 27 4
gpt4 key购买 nike

我正在寻找一种干净的方法来评估 object 并在条件得到验证时返回 object ,否则返回 nil 以便我可以改用默认值。像这样的东西:

result = object.verify?{ |object| object.test? } || default_value

我可以看到几种实现方法,但我希望有一种内置方法可以做到这一点。例如:

  • 进入数组

    def verify?(&block)
    Array(self).filter(block).first
    end
  • 使用instance_eval

    def verify?(&block)
    self.instance_eval{ |object| yield(object) ? object : nil}
    end

编辑

这是我的实际示例(尽管问题并不局限于此):

class User < ActiveRecord::Base
def currency
self.billing_information.try(:address).try(:country).try(:currency_code).instance_eval{ |currency| Finance::CURRENCIES.include?(currency) ? currency : nil} || 'EUR'
end
end

我知道这很丑陋,但我确实喜欢它的逻辑:如果我正在寻找的对象存在,就去获取下一个。第一个条件是存在(使用 try ),然后是包含。

最佳答案

关于您的实际问题 - Rails 提供 presence_in :

Returns the receiver if it's included in the argument otherwise returns nil.

'EUR'.presence_in %w(EUR USD) #=> "EUR"
'JPY'.presence_in %w(EUR USD) #=> nil

我可能会将实际货币与经过验证的货币分开(这样您仍然可以访问前一种货币):

class User < ActiveRecord::Base
def currency
billing_information.try(:address).try(:country).try(:currency_code)
end

def verified_currency
Finance::CURRENCIES.include?(currency) ? currency : 'EUR'
end
end

并将检查货币和提供默认货币的逻辑移动到 Finance 中:

class User < ActiveRecord::Base
def currency
billing_information.try(:address).try(:country).try(:currency_code)
end

def verified_currency
Finance.verified_currency(currency)
end
end

module Finance
CURRENCIES = %w(EUR USD)
DEFAULT_CURRENCY = 'EUR'

def self.verified_currency(currency)
CURRENCIES.include?(currency) ? currency : DEFAULT_CURRENCY
end
end

这也避免了对 User#currency 求值两次。

try-chain 可以替换为 delegate :

class User < ActiveRecord::Base
delegate :currency, to: billing_information, allow_nil: true

def verified_currency
Finance.verified_currency(currency)
end
end

class BillingInformation < ActiveRecord::Base
delegate :currency, to: address, allow_nil: true
end

class Address < ActiveRecord::Base
delegate :currency, to: country, allow_nil: true
end

关于ruby - 如果在对象上则保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32697326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com