使用条件运算符“ for”和Ruby的.each

时间:2019-04-30 00:37:05

标签: ruby loops hash

我正在尝试解决Ruby中应该是一个非常简单的问题。我的目标是使用for循环和.each方法获取以下哈希值并打印值和键。

my_stocks = { 'Apple' => { 'symbol' => 'AAPL', 'price' => 100 },
          'Google' => { 'symbol' => 'GOOG', 'price' => 1150 },
          'Tesla' => { 'symbol' => 'TSLA', 'price' => 295 },
          'Microsoft' => { 'symbol' => 'MSFT', 'price' => 95},
          'Netflix' => { 'symbol' => 'NFLX', 'price' => 300},
          'Facebook' => { 'symbol' => 'FB', 'price' => 175},
          'Amazon' => { 'symbol' => 'AMZN', 'price' => 1250} }

因此,我正在使用此定义的方法来打印整个哈希值:

def execute_exercise(my_stocks)
for i, j in my_stocks
  puts j
end
end

显然,这成功了。我接下来要做的是,使用for循环仅打印超过500个键的值。

我想出的每个解决方案都会在Ruby中引发一个错误:

rbtest.rb:18:in `>': no implicit conversion of Fixnum into Hash (TypeError)
from rbtest.rb:18:in `block in execute_exercise'
from rbtest.rb:18:in `each'
from rbtest.rb:18:in `execute_exercise'
from rbtest.rb:25:in `<main>'

我尝试过的尝试是:

my_stocks.each {|symbol,price| puts symbol if price > 500}
for q, e in my_stocks.to_i < 500
      puts e
    end

我希望这些值可以从哈希表中打印出来,但是很明显,我在这里缺少了一些东西。如果没有.to_h,我无法将fixnum转换为hash,但是那还行吗?我只是误解了循环还是其他东西?

2 个答案:

答案 0 :(得分:4)

您要Ruby在这里一次做太多事情:

for q, e in my_stocks.to_i < 500

那真的没有任何意义。 for遍历一个容器。 to_i返回一个整数。 x.to_i < n返回一个布尔值。您不能遍历布尔值。另外,my_stocks是一个哈希,并且没有to_i,因此整行都不是Ruby可以理解的。

请换个角度考虑这个问题。 Ruby的方法是将其分解为多个步骤。首先,找到所有具有特定价值的股票:

my_stocks.select do |_name, data|
  data['price'] > 500
end.each do |name, data|
  # ... print or whatever
end

Enumerable中使用它来分两个阶段帮助解决问题。 select进行过滤,each进行迭代。在Ruby for中并没有真正使用过,它实际上从来不是最好的工具。

Enumerable的真正力量在于您可以将一个操作直接链接到下一个操作。 end.each对于不熟悉Ruby的人来说可能看起来很奇怪,但这确实是Ruby轻松处理复杂操作的方式。

例如,按价格(从最高到最低)进行过滤和排序只是一个小的修改:

my_stocks.select do |_name, data|
  data['price'] > 500
end.sort_by do |_name, data|
  -data['price']
end.each do |name, data|
  # ... print or whatever
end

-data['price']部分是避免以后必须反转值的简便方法。通常,它以升序排序,因此,当最高值变为最低值时,倒序以递减次序排序。

答案 1 :(得分:0)

您可以使用像这样的循环语法,但是只使用“ next”跳过价格不符合您要求的商品的迭代:

for q, e in my_stocks
  next unless e['price'] > 500 
  puts q
  puts e
end

这将输出:

Google
{"symbol"=>"GOOG", "price"=>1150}
Amazon
{"symbol"=>"AMZN", "price"=>1250}