我正在使用與二維數組中的第一項(從csv文件導入)匹配的ruby模塊,並返回第二項。這聽起來非常簡單,我可以讓它工作,直到我試圖匹配不在數組中的項目。當發生這種情況時,出於某種原因,整個數組被返回。我能夠制定一個解決方法,涉及一個布爾變量'found',但我想知道爲什麼這不能像書面一樣工作。在數組中搜索不存在的項返回整個數組
require 'csv'
class Nutrition
@list = CSV.read("./lib/list.csv")
def self.carbs(name)
grams = @list.each do |item|
if item[0] == name
return item[1]
end
end
if grams == nil
grams = "error"
end
return grams
end
end
的list.csv文件如下:
onion,13.75,0,0
carrot,11.375,0,0
cauliflower,19.375,0,0
cabbage,20.125,0,0
sw pepper,20,0,0
leek,7.5,0,0
mushroom,16.375,0,0
celery,33.25,0,0
apple,6.37,0,0
sweet potato,4.875,0,0
broccoli,14.8,0,0
red mill museli,1.52,0,0
mixed nuts,0,0,0.65
B. Sprouts,11,0,0
eggplant,16.66,0,0
quinoa,4.7,0,0
brown rice,4.33,0,0
sesame seed,0,0,4.5
sesame oil,0,0,4.655
pork chop,0,3.84,28.57
chick breast,0,3.22,27.77
lean turkey,0,4,100
ham,0,4.76,26.66
我編輯的我原來的代碼如下:
require 'csv'
class Nutrition
include Enumerable
@list = CSV.read("./lib/list.csv")
def self.carbs(name)
result = @list.detect {|item| item|0| == name}
if result.nil?
result = "error"
end
result
end
end
現在,當我使用以下testfile的運行rake測試:
require './lib/nutrition.rb'
require "test/unit"
require 'csv'
class TestNutrition < Test::Unit::TestCase
include Enumerable
def test_carbs()
assert_equal(Nutrition.carbs('onion'), "13.75")
assert_equal(Nutrition.carbs('ham'),'0')
assert_equal(Nutrition.carbs('sawdust'), 'error')
end
end
I wind up wit h以下錯誤消息:
語法錯誤,意外==(SyntaxError) result = @ list.detect {| item |項| 0 | ==名} ^
然而,當我運行下面的文件,一切似乎工作,我似乎無法通過耙測試:
require 'csv'
class Nutrition
include Enumerable
@list = CSV.read("./lib/list.csv")
def self.carbs(name)
result = @list.detect {|item| item[0] == name}
if result.nil?
result = "error"
end
result
end
end
result = Nutrition.carbs('sawdust')
puts result
您可以通過編寫'@list.each {| item | return item.last if item.first == name}; 「錯誤」; end',但是使用'find'(又名'detect')是要走的路。 –