【发布时间】:2019-09-18 14:46:24
【问题描述】:
我正在尝试解决 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 转换为哈希,但这是否有效?我只是误解了 for 循环还是其他原因?
【问题讨论】:
-
我们没有像其他语言那样的“守卫”,而是我们通常使用链式方法处理迭代。真正简单的方法是你的第一个代码
puts j if j[:price] > 500