用用户输入/用最少的代码行填充数组的最简单方法

时间:2019-10-21 09:40:32

标签: ruby

从用户输入中创建由x个数量的元素组成的数组的最简单方法是什么?该元素由混合数据类型(即具有字符串,整数和浮点数的数组)组成

到目前为止,我编写了一些使用for循环的代码,但我想知道是否有一种方法可以对其进行优化并且代码行最少。

buttons: [
        {
          side: 'start',
          icon: 'star',
          text: 'Favorite',
          handler: () => {
            this.navCtrl.navigateForward('/path')
          }
        }, 

5 个答案:

答案 0 :(得分:5)

最少行数?一。一旦拥有max

array = max.times.map { gets.chomp.then { |l| case l when /^\d+$/ then l.to_i when /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/ then l.to_f else l end } }

这甚至更短(尽管有些人会反对):

array = max.times.map { gets.chomp.then { |l| Integer(l) rescue Float(l) rescue l } }

尽管将其写成几行会更易读。

还请注意,Rubyists基本上假装for在该语言中不存在,并且通常将其替换为Enumerable#eachInteger#times等。


这与您拥有的不完全相同;我的代码无法使用有效数字的字符串,例如"2.0"。如果您想要该功能,您的代码也不会太糟糕(通常误导行数)。我会改变的事情:

  • 循环。随时在array = max.times.map do ... endfor。 (这也使得不必明确分配给array[i]。)

  • "float".start_with?(data_type.downcase)而不是%W[Float FLOAT float f F].include?(data_type),因此您不必担心列出所有变体。

答案 1 :(得分:2)

除了接受stringintfloat不区分大小写(例如,现在stRinG也可以)以外,无需更改任何行为,您可以执行以下操作。 / p>

puts "how many elements?"
max = gets.to_i

array = max.times.map do
  puts "are you entering in a string, an int or a float?"

  case gets
  when /\A(string|s)\Z/i
    puts "enter in a string"
    gets.chomp
  when /\A(int|i)\Z/i
    puts "enter an int"
    gets.to_i
  when /\A(float|f)\Z/i
    puts "enter a float"
    gets.to_f
  end
end

print array

注意:您可能想在 case 语句内添加 else ,以处理用户未输入的情况stringintfloat。当前,它将在数组中产生一个nil值。

您可能希望通过以下方式实现此目的:

case gets
when # ...
  #...
else
  redo
end

答案 2 :(得分:2)

好,我咬。

p Array.new(puts("How many elements?") || gets.to_i) {
  puts("Are you entering in a string, an int or a float?") ||
  case(gets.chomp)
  when "string", "S" then (puts("Enter a string")   || gets.chomp)
  when "int", "INT"  then (puts("Enter an integer") || gets.to_i)
  when "float", "F"  then (puts("Enter a float")    || gets.to_f)
  end
}

以下对话框:

How many elements?: 3

Are you entering in a string, an int or a float?: int
Enter an integer: 5

Are you entering in a string, an int or a float?: S    
Enter a string: hi

Are you entering in a string, an int or a float?: F
Enter a float: 3.4

将显示以下内容(并返回):

[5, "hi", 3.4]

我使用p而不是puts(它将每行显示一个数组的元素)来表明它是一个要显示的数组。请注意,摘要中的每个puts都会返回nil,所以nil || x #=> x

此代码段有八行,但可以通过删除换行符将其减少为一行:

p Array.new(puts("How many elements?") || gets.to_i) { puts("Are you entering in a string, an int or a float?") || case(gets.chomp) when "string", "S" then  (puts("Enter a string") || gets.chomp) when "int", "INT"  then (puts("Enter an integer") || gets.to_i) when "float", "F" then (puts("Enter a float") || gets.to_f) end }

答案 3 :(得分:0)

使用Hash作为助手:

datatypes = { i: { convert: 'to_i', text: 'an integer' }, f: { convert: 'to_f', text: 'a float' } }
datatypes.default = { convert: 'to_s', text: 'a string' }

array = max.times.map do
  puts "Are you entering in an (i)nt, a (f)loat or a string (default)?"
  data_type = gets[0].downcase.to_sym # you can improve this part
  puts "enter in #{datatypes[data_type][:text]}"
  gets.chomp.send(datatypes[data_type][:convert])
end

p array
p array.map &:class

答案 4 :(得分:0)

  

到目前为止,我编写了一些使用for循环的代码,但我想知道是否有一种方法可以对其进行优化并且代码行最少。

在Ruby中,不需要换行符,因此Ruby中 any 问题的“最少行代码”总是 1:

puts "how many elements?"; max = gets.to_i; array = []; for i in 0..max - 1 do puts "are you entering in a string, an int or a float?"; data_type = gets.chomp; if %W[string STRING String s S].include?(data_type) then puts "enter in a string"; array[i] = gets.chomp elsif %W[int INT Int i I].include?(data_type) then puts "enter an int"; array[i] = gets.to_i elsif %W[Float FLOAT float f F].include?(data_type) then puts "enter a float"; array[i] = gets.to_f end end; print array