从用户输入中创建由x个数量的元素组成的数组的最简单方法是什么?该元素由混合数据类型(即具有字符串,整数和浮点数的数组)组成
到目前为止,我编写了一些使用for循环的代码,但我想知道是否有一种方法可以对其进行优化并且代码行最少。
buttons: [
{
side: 'start',
icon: 'star',
text: 'Favorite',
handler: () => {
this.navCtrl.navigateForward('/path')
}
},
答案 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#each
,Integer#times
等。
这与您拥有的不完全相同;我的代码无法使用有效数字的字符串,例如"2.0"
。如果您想要该功能,您的代码也不会太糟糕(通常误导行数)。我会改变的事情:
循环。随时在array = max.times.map do ... end
上for
。 (这也使得不必明确分配给array[i]
。)
"float".start_with?(data_type.downcase)
而不是%W[Float FLOAT float f F].include?(data_type)
,因此您不必担心列出所有变体。
答案 1 :(得分:2)
除了接受string
,int
和float
不区分大小写(例如,现在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 ,以处理用户未输入的情况string
,int
或float
。当前,它将在数组中产生一个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