gpt4 book ai didi

ruby-on-rails - 如何更简洁地写这个?

转载 作者:数据小太阳 更新时间:2023-10-29 08:31:52 27 4
gpt4 key购买 nike

RoR 中是否有一个结构可以让我这样写:

@budget_project_amounts.detect {|attributes| attributes['id'] == 659 }.attributes['amount'] if !@budget_project_amounts.detect {|attributes| attributes['id'] == 659 }.nil?

更简洁?不使用变量...

编辑:这部分

@budget_project_amounts.detect {|attributes| attributes['id'] == 659 }

无关紧要。它可以是任何东西。我有时会遇到这样的情况,在这种情况下,我首先需要检查某些东西是否为零,然后才能继续在它下面获得一个值(如果它不是零,我正在寻找一种方法来做到这一点而无需完全重复第一部分。我希望这是有道理的。

最佳答案

避免使用变量...您可以首先尝试使用 try 消除末尾的 if 条件:

@budget_project_amount.detect {|attributes| attributes['id'] == 659 }
.try(attributes).try(:[], 'amount')

但是,仅仅因为代码更少并不能真正使它成为更好的代码。您原来的方法和这种方法的问题在于它们都依赖类型检查(对于 NilClass)来完成工作。类型检查是一种代码味道。

我喜欢使用 Naught 绕过类型检查.使用正确的空对象设置,您可以改为这样做:

Maybe(@budget_project_amount.detect {|attributes| attributes['id'] == 659 }).attributes[:amount].to_f

基本上,忘记类型检查,只做你想做的,并确保最终结果是你正在寻找的对象类型(使用 .to_f.to_i 或其他)。

为了让上面的例子起作用,我定义了我的 null 对象:

require 'naught'

NullObject = Naught.build do |config|
config.define_explicit_conversions
config.define_implicit_conversions
config.black_hole

if $DEBUG
config.traceable
else
config.singleton
end
end

这提供了显式转换(对于 .to_f)并且是一个黑洞(它允许在链中调用多个方法,而不管 nil 出现在该链中的何处)。

关于ruby-on-rails - 如何更简洁地写这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471684/

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