我使用单一方法制作了一个简单的程序,我正在尝试测试它,但我一直得到这个奇怪的错误,我不知道它为什么会一直发生。 这是我写的唯一方法的代码:
(Num a, Ord a)
然后这就是我调用方法的内容(在同一个程序中)。
def make_database(lines)
i = 0
foods = hash.new()
while i < lines.length do
lines[i] = lines[i].chomp()
words = lines[i].split(',')
if(words[1].casecmp("b") == 0)
foods[words[0]] = words[3]
end
end
return foods
end
我感到非常困惑,特别是因为它为每个“未定义方法'新'(随机数)”提供了一个不同的随机数。
答案 0 :(得分:2)
这是一个简单的错误。 hash
在当前对象上调用一个方法,该方法返回Hash结构用于索引条目的数字,其中Hash
是您可能想要的哈希类:
foods = Hash.new()
或者更简洁:
foods = { }
使用{ }
代替Hash.new
是理想的,除非您需要指定默认值之类的内容,例如:
Hash.new(0)
默认情况下,所有值都初始化为0
。这在创建简单计数器时非常有用。
Ruby类由大写字母标识,以避免混淆这样的情况。一旦你习惯了语法,你就可以更容易地发现错误。
请注意,在编写Ruby代码时,您几乎总是会在空参数列表中省略大括号/括号。这是x()
简称为x
。这使代码更具可读性,尤其是在链接时,例如x.y.z
而不是x().y().z()
需要注意的其他事项包括能够使用readlines
读取所有行,而不是您手动编写它的地方。尝试:
make_database($stdin.readlines.map(&:chomp))
对代码进行更积极的重构如下所示:
def make_database(lines)
# Define a Hash based on key/value pairs in an Array...
Hash[
# ...where these pairs are based on the input lines...
lines.map do |line|
# ...which have comma-separated components.
line.split(',')
end.reject do |key, flag, _, value|
# Pick out only those that have the right flag.
flag.downcase == 'b'
end.map do |key, flag, _, value|
# Convert to a simple key/value pair array
[ key, value ]
end
]
end
这可能有点难以理解,但是一旦你把一系列简单的操作链接在一起,你的Ruby代码就会更灵活,更容易阅读。