【问题标题】:Convert user input into integer in array in Ruby?在Ruby中将用户输入转换为数组中的整数?
【发布时间】:2017-09-30 15:51:19
【问题描述】:

我希望用户的输入变成一个整数,它是一个新数组中的 [0] 索引,我想稍后添加更多项目。有没有办法将用户的输入转换为数组而不将其更改为整数并推送它?这是我当前的代码:

guesses = []
puts "Guess what number I'm thinking of. It's between 1 and #{solution_range}"
guess = gets.to_i
guesses.push(guess)

【问题讨论】:

  • 如果您希望它是整数,则必须转换为整数(gets 将返回 String)。您可以将代码缩短为 guesses << gets.to_i 并获得相同的结果。
  • guesses = [gets.to_i] 也许。
  • 您可以分配方法链的结果(参见下面的my answer),但通常可读性胜过聪明。 YMMV。
  • @sagarpandya82 按照您建议的方式分配文字会起作用,但使用 Kernel#Integer 比 String#to_i 更安全。所以,guesses = [Integer(gets)] 可能是更好的选择,如果您只是在寻找保证单元素数组的最短代码并希望避免链接方法。

标签: arrays ruby methods refactoring


【解决方案1】:

使用严格的强制转换

必须将输入转换为整数,因为Kernel#gets 总是返回字符串或 nil。作为单行执行此操作的一种方法是将空哈希分配给您的变量,然后将强制转换附加到哈希。这可能比您当前的方法更快,但我实际上并没有对其进行基准测试。

例如在提示符处输入1,会得到:

print 'Enter integer: '
guesses = [] << Integer(gets)
#=> [1]

这种方法的一个很好的副作用是,如果您不能使用Kernel#Integer 强制转换整数,您将得到一个适当的异常。例如:

输入整数:foo
ArgumentError:Integer() 的值无效:“foo\n”

当你需要严格的演员表时避免使用 String#to_i

使用String#to_i 并不总是符合您的预期。假设您在提示符处输入foo,请考虑以下内容:

print 'Enter integer: '
guesses = [] << gets.to_i
#=> [0]

因为 String#to_i 对转换比 Kernel#Integer 更宽松,所以任何非整数响应(包括 nil)都将转换为 0。有时这可能是您想要的,但对于您发布的用例而言,这不太可能是可取的。

【讨论】:

  • 不仅仅是guesses = [Integer(gets)]?
  • @CarySwoveland 如果你愿意,你可以。但为什么你认为这更明确或更易读?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2012-06-02
  • 2016-09-04
相关资源
最近更新 更多