我正在尝试解决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,但是那还行吗?我只是误解了循环还是其他东西?
答案 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}