Почему этот оператор случая Ruby возвращает «не может преобразовать nil в String (TypeError)» при использовании с ||? - PullRequest
1 голос
/ 23 ноября 2011

Первоначально у меня был этот код, написанный как серия операторов if, но, узнав больше о Ruby, решил, что оператор case может быть более подходящимТем не менее, теперь он, кажется, не работает, и я не уверен, почему.

location = gets.chomp.downcase

case location
when 'v' || 'vaca'
  file1, file2 = 'vMasterLocation.csv', 'vMasterSR.csv'
when 'c' || 'comm'
  file1, file2 = 'cMasterLocation.csv', 'cMasterSR.csv'
else
  puts "Not a valid location."
  exit
end

Оператор работает как ожидалось, когда location вводит либо V, v, Cили c, но всякий раз, когда я пытаюсь ввести vaca или comm Ruby, возвращаем следующее: csv.rb:1335:in 'initialize': can't convert nil into String (TypeError)

Я неправильно использую || или, возможно, я неправильно понял выражения case?Любая обратная связь высоко ценится.Спасибо!

Здесь, в предыдущем выражении, это просто оператор if для справки:

location = gets.chomp.downcase
if location == 'v' || location == 'vaca'
  file1, file2 = 'vMasterLocation.csv', 'vMasterSR.csv'
elsif location == 'c' || location == 'comm'
  file1, file2 = 'cMasterLocation.csv', 'cMasterSR.csv'
else
  puts "Not a valid location."
  exit
end

Кроме того, это правильное использование Ruby оператора caseнад if заявлением?Я пытаюсь понять, когда уместнее использовать один поверх другого.

Ответы [ 2 ]

7 голосов
/ 23 ноября 2011

Используйте запятую вместо ||:

case location
when 'v', 'vaca'

См. здесь для получения дополнительной информации о синтаксисе операторов case.

1 голос
/ 23 ноября 2011

Попробуйте это:

location = gets.chomp.downcase

case location
when 'v', 'vaca'
  file1, file2 = 'vMasterLocation.csv', 'vMasterSR.csv'
when 'c', 'comm'
  file1, file2 = 'cMasterLocation.csv', 'cMasterSR.csv'
else
  puts "Not a valid location."
  exit
end
...