Передача отдельных элементов массива в оператор case в Ruby - номера ЖК-дисплея

Я пытаюсь передать массив чисел в оператор case. Например: я прошу пользователя ввести значение, например 12. Затем я разбиваю его на массив [1,2]. Затем я передаю его в оператор case своего метода. Мой оператор case выводит цифровой формат 1 и 2.

Моя проблема: я не могу заставить его печатать более одного элемента. Как я могу вывести 1 и 2 как цифровое число с 1 массивом? Или с пользовательским вводом? Мой код далеко?

Мой код:

puts "Enter numbers between 0-9 up to 2 digits: "

x = gets.chomp
x = x.split('')

def digital_number(n)

digits = n

#Start case for digit input
  case digits
  when ["1"]
  puts " | "
  puts "   "
  puts " | "
  puts "   "
  puts n

  when ["2"]
  puts " - "
  puts "  |"
  puts " - "
  puts "|  "
  puts " - "

  else
  puts "That is not an available number."

  end
end

digital_number(x)

person balee1991    schedule 01.04.2017    source источник


Ответы (3)


x - это ваш массив цифр. Каждую цифру следует передавать в case последовательно:

number = gets.chomp
digits = number.split('')

digits.each { |digit| digital_number(digit) }

И регистр цифр:

case digit
when '1'
  # ...
when '2'
  # ...
end
person Vasili    schedule 01.04.2017
comment
Спасибо! был сбит с толку на секунду, потому что я помещал функцию .each над своим случаем. В моем мозгу я думал о том, что вы вложили ... но не думаю, что раньше мог написать это правильно. - person balee1991; 02.04.2017
comment
Вы бы знали, как я могу теперь выводить цифровые числа рядом? Так как он перебирает каждое число и выводит его с новой строки. Есть ли способ разместить их по горизонтали? так что его горизонтальная печать 1 2 вместо вертикально 1, 2? - person balee1991; 02.04.2017
comment
Это невозможно, если вы печатаете цифры одну за другой. Вы можете сохранить каждую строку в переменной, т.е. when '1' lines[0] << ' | ' lines[1] << ' ' и так далее (lines - это массив строк), а затем распечатать ее построчно, то есть lines.each { |line| puts line }. - person Vasili; 02.04.2017

Это очень похоже на ответ Василия Юдина, только со сканированием, и то же самое, что он также сказал в своем комментарии.

puts "Enter numbers between 0-9 up to 2 digits: "

x = gets.chomp
@arr = []

def digital_number(n)

  #Start case for digit input
  case n
  when "1" 
    @arr << " | "
    @arr << " | "
    puts n

  when "2" 
    @arr << "-" 
    @arr << " |"
    @arr << "-" 
    @arr << "| "
    @arr << "-" 
  else
    puts "That is not an available number."
  end 
end

x.scan(/\w/).each{|d| digital_number(d)}
puts @arr.join(' ')
person Jake    schedule 02.04.2017
comment
Думаю, у меня есть идея манипулировать тем, что вы мне дали. Я попробую и сделаю репост, если у меня все получится ... - person balee1991; 02.04.2017
comment
Я поддержал людей, которые помогли. Но он говорит, что он не может быть показан публично для лиц с репутацией ниже 15. - person balee1991; 04.04.2017

Приведенный ниже код решает мою проблему. Можно удалить '#' для ARGV, если вы хотите добавить аргумент к коду. Но только для использования в терминале у нас есть gets.chomp. Спасибо за помощь. Это решает мою проблему, даже если это не самый эффективный способ.

# Add an argument in the terminal and
# .to_s converts the argument into a string
# so that ".scan" can take a string argument

#x = ARGV.to_s

x = gets.chomp
puts "Arguments entered is between 0-9: #{x}"

#These are empty arrays that get added in the cases
@arr1 = []
@arr2 = []
@arr3 = []
@arr4 = []
@arr5 = []

def digital_number(n)

#Start case for digit input
case n

when "0"
@arr1 << " - "
@arr2 << "| |"
@arr3 << "   "
@arr4 << "| |"
@arr5 << " - "

when "1"
@arr1 << "   "
@arr2 << " | "
@arr3 << "   "
@arr4 << " | "
@arr5 << "   "

when "2"
@arr1 << " - "
@arr2 << "  |"
@arr3 << " - "
@arr4 << "|  "
@arr5 << " - "

when '3'
@arr1 << " - "
@arr2 << "  |"
@arr3 << " - "
@arr4 << "  |"
@arr5 << " - "

when '4'
@arr1 << "   "
@arr2 << "| |"
@arr3 << " - "
@arr4 << "  |"
@arr5 << "   "

when '5'
@arr1 << " - "
@arr2 << "|  "
@arr3 << " - "
@arr4 << "  |"
@arr5 << " - "

when '6'
@arr1 << " - "
@arr2 << "|  "
@arr3 << " - "
@arr4 << "| |"
@arr5 << " - "

when '7'
@arr1 << "-- "
@arr2 << "  |"
@arr3 << "   "
@arr4 << "  |"
@arr5 << "   "

when '8'
@arr1 << " - "
@arr2 << "| |"
@arr3 << " - "
@arr4 << "| |"
@arr5 << " - "

when '9'
@arr1 << " - "
@arr2 << "| |"
@arr3 << " - "
@arr4 << "  |"
@arr5 << " - "

else
  puts "That is not an available number."
end
end
# This part iterates the method for each numbers inputted
x.scan(/\w/).each{|d| digital_number(d)}

# Output #
puts "   "
puts @arr1.join(' ')
puts @arr2.join(' ')
puts @arr3.join(' ')
puts @arr4.join(' ')
puts @arr5.join(' ')
person balee1991    schedule 02.04.2017