我对Ruby很新。我一直试图找到一种用户输入进行计算的方法。我想做两件事:
到目前为止,我只有这个循环请求用户输入:
f = "yes"
while f == "yes"
print "Enter your name: "
n = gets.chomp.to_f
print "Enter the number of dinosaurs you have: "
d = gets.chomp.to_f
print "Enter the number of jellyfish you have: "
j = gets.chomp.to_f
print "Another friend? (yes/no)"
f = gets.chomp
end
感谢任何帮助。非常感谢你!
更新: 非常感谢你的帮助。我意识到我不够具体。我会在这里澄清一下。
我想要的输出看起来像这样(~~是用户输入的东西):
Enter your name: ~ Bob~
Enter the number of dinosaur you have: ~3~
Enter the number of jellyfish you have: ~6~
Another friend? (yes/no) ~yes~
Enter your name: ~ Sally~
Enter the number of dinosaur you have: ~2~
Enter the number of jellyfish you have: ~8~
Another friend? (yes/no) ~no~
Friend who has the most dinosaurs: Bob
Friend who has the most jellyfish: Sally
Friend who has the most dinosaurs and jellyfish combined: Sally
到目前为止,我写的代码只让我“另一个朋友?(是/否)”但我不知道如何让Ruby输出我想要的最后三行。你们可以对此有所了解吗?
非常感谢!
更新更新: 感谢您所有的帮助!用Hash和Array搞定了。谢谢!
答案 0 :(得分:2)
你的问题的答案有三个。
gets
从stdin返回一行,包括换行符。如果用户输入 B o b 输入,则gets
返回"Bob\n"
。< / p>
要剥离换行符,请使用String#chomp
:
"Bob\n".chomp #=> "Bob"
要将"3\n"
之类的输入转换为整数3
,您可以使用String#to_i
:
"3\n".to_i #=> 3
请注意,to_i
会忽略无关的字符(包括换行符),因此您可以避免使用chomp
。
您可能希望将用户的数据存储在一个位置。在像Ruby这样的面向对象编程语言中,这样的&#34; place&#34;通常是一个班级。它可以很简单:
class User
attr_accessor :name, :dinosaurs, :jellyfish
end
attr_accessor
创建了getter和setter,因此您可以通过以下方式读取和写入用户的属性:
user = User.new
user.name = 'Bob'
user.name #=> "Bob"
由于您不想只需要一个用户,因此您需要另一个地方来存储用户。
Array
可以正常使用:
users = []
user = User.new
user.name = 'Bob'
user.dinosaurs = 3
users << user
users
#=> [#<User @name="Bob", @dinosaurs=3>]
添加第二位用户:
user = User.new # <- same variable name, but new object
user.name = 'Sally'
user.dinosaurs = 2
users << user
users
#=> [#<User @name="Bob", @dinosaurs=3>, #<User @name="Sally", @dinosaurs=2>]
从数组中检索用户(或其属性):
users[0] #=> #<User @name="Bob">
users[0].name #=> "Bob"
users[1].name #=> "Sally"
Array
包含Enumerable
mixin中的许多有用方法。
要获得一个具有最大值的元素max_by
- 它将每个元素(即用户)传递给一个块,并且该块必须返回您感兴趣的值(例如{{1 }})。 dinosaurs
然后返回具有最高max_by
值的用户:
dinosaurs
您还可以计算值:
users.max_by { |u| u.dinosaurs }
#=> #<User @name="Bob">
但是这会导致异常,因为我们没有在上面设置users.max_by { |u| u.dinosaurs + u.jellyfish }
。
答案 1 :(得分:0)
现在您正在尝试通过调用to_f
将名称变为浮点数(数字)。当它从用户进来时它已经是一个字符串,并且应该保留一个字符串。
此外,您当前正在覆盖循环的每次迭代中的每个变量。因此,如果鲍勃填补了这一点,并希望添加一个朋友,莎莉,鲍勃的所有信息都会被莎莉的信息覆盖。
相反,您需要创建一个哈希或数组,然后从您的循环中逐个添加每个用户。
continue = "yes"
users = {}
while continue == "yes"
print "Enter your name: "
name = gets.chomp.to_f
print "Enter the number of dinosaurs you have: "
dinosaursCount = gets.chomp.to_f
print "Enter the number of jellyfish you have: "
jellyfishCount = gets.chomp.to_f
users[name] = {dinosaurs: dinosaursCount, jellyfish: jellyfishCount}
print "Another friend? (yes/no)"
continue = gets.chomp
end
现在,如果通过命令行添加了Bob和Sally,您可以通过执行以下操作获取数据:
users.Bob #{dinosaurs: 10, jellyfish: 10}
users.Bob.dinosaurs #10
users.Bob.jellyfish #10