【发布时间】:2016-04-24 05:08:25
【问题描述】:
我正在开发一个与二维数组(从 csv 文件导入)中的第一项匹配并返回第二项的 ruby 模块。这听起来非常简单,我能够让它工作,直到我尝试匹配一个不在数组中的项目。发生这种情况时,出于某种原因,将返回整个数组。我能够安装一个变通方法,涉及一个布尔变量“找到”,但我想知道为什么这不能像所写的那样工作。
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
现在,当我使用以下测试文件运行 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
我最终收到以下错误消息:
语法错误,意外 == (SyntaxError) 结果 = @list.detect {|item|项目|0| == 名称} ^
但是,当我运行以下文件时,似乎一切正常,但我似乎无法通过 rake 测试:
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 }; "error"; end来完成这项工作,但使用find(又名detect)是可行的方法。