gpt4 book ai didi

ruby - 从条件语句构建散列

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

我正在尝试从条件语句构建散列

def create_hash(opt ={})

hash = {:a => if opt[:a] ? a : 0.40; end},
:b => if opt[:b] ? b : 0.30; end,
:c => if opt[:c] ? c : 0.05; end}
end

create_hash :a => 0.30
#hash = {:a => 0.30, :b => 0.30, :c => 0.05}

我试过使用 tap,但它似乎只会在满足条件时返回一个值,而不是返回其他值 - Building a hash in a conditional way .有没有一种创建这样的条件哈希的好方法?

最佳答案

merge使这非常简洁:

def create_hash(opt ={})
{
a: 0.40,
b: 0.30,
c: 0.05
}.merge(opt)
end

create_hash :a => 0.30
# => {:a=>0.3, :b=>0.3, :c=>0.05}

我们在一些内部代码中使用 merge 来微调配置数据。我们有一个全局 YAML 文件,然后如果我们需要为特定的应用程序或主机指定不同的内容,我们有一个小的 YAML 文件,其中只包含我们需要修改的哈希数据。我们将较小的散列与全局散列合并,并仅覆盖需要更改的数据。

看看你在做什么:

hash = {:a => if opt[:a] ? a : 0.40; end},
:b => if opt[:b] ? b : 0.30; end,
:c => if opt[:c] ? c : 0.05; end}

关于 Ruby 的工作原理存在很多困惑。您会立即遇到语法错误:

opt = {}
hash = {:a => if opt[:a] ? a : 0.40; end},
:b => if opt[:b] ? b : 0.30; end,
:c => if opt[:c] ? c : 0.05; end}
# =>
# ~> -:3: syntax error, unexpected =>, expecting end-of-input
# ~> :b => if opt[:b] ? b : 0.30; end,
# ~> ^

那是因为你不能:

  • 在散列分配中使用尾随条件。
  • } 结束第一行, 终止散列构造。

清理缩进并删除 ifend;...:

opt = {}
hash = {
:a => opt[:a] ? a : 0.40,
:b => opt[:b] ? b : 0.30,
:c => opt[:c] ? c : 0.05
}
# => {:a=>0.4, :b=>0.3, :c=>0.05}

那行得通,但是它仍然有代码味道,因为由于三元 ("?:") 语句很难看清到底发生了什么。三元语句本身并不是邪恶的,但它们可能更难阅读,因此请谨慎使用它们,并始终意识到它们会影响代码的清晰度。

关于ruby - 从条件语句构建散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27218182/

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