ruby中的条件布尔If语句语法

时间:2017-07-21 18:37:06

标签: ruby boolean

如果属性的条件为true,我希望API的push元素进入我的数组。因此k_api_hash['awsaccounts'][i]['sandman']将返回truefalse,如果条件为真,我想将帐号输入数组; (k_api_hash['awsaccounts'][i]['accountnumber'])会返回一个帐号。

代码

k_api_hash = JSON.parse(kens_api)
aws_account_size = k_api_hash["awsaccounts"].size
aws_account_array = []

i = 0
while i < aws_account_size
  if k_api_hash['awsaccounts'][i]['sandman'] == "true"
    aws_account_array.push(k_api_hash['awsaccounts'][i]['accountnumber'])
    i += 1
  else
    i += 1
  end
end

puts "Here are all the aws accounts"
puts aws_account_array.inspect

问题是它返回空值,但如果取出if条件,则成功将帐号推入数组。

输出

Here are all the aws accounts
[] 

2 个答案:

答案 0 :(得分:0)

if每次都会返回false,因为您要将"true" String )与true进行比较( TrueClass )/ false FalseClass );请考虑以下代码:

true == "true"
#=> false

false == "true"
#=> false

true != "true"
#=> true

要使其有效,只需从== "true"中删除if 1

if k_api_hash['awsaccounts'][i]['sandman']

1 请记住,if中的任何表达式都会返回true / false(或 truthy / 这个问题的假值值无需进一步比较。

与错误无关,但可以通过使用不同的迭代器并删除不必要的变量来优化代码;例如,以下代码将产生相同的输出:

k_api_hash = JSON.parse(kens_api)

aws_account_array = k_api_hash["awsaccounts"].each_with_object([]) do |account, r|
  r << aws_account_array.push(account['accountnumber']) if account['sandman']
end

要更好地了解正在发生的事情,请查看Enumerable#each_with_object

答案 1 :(得分:0)

我认为这可以胜任:

k_api_hash = JSON.parse(kens_api)
awsaccounts = k_api_hash['awsaccounts']
aws_account_array = awsaccounts.reduce([]) { |array, acc|
  array << acc['accountnumber'] if acc['sandman']
  array
}

如果API返回的字符串布尔值如"true""false",则可以执行以下哈希:

  bools = {true=>true, 'true'=>true}

并使用api返回作为reduce

中的键来调用它
  array << acc['accountnumber'] if bools[acc['sandman']]