Происходит ли выражение о рубиновом случае?

Я пишу палач-игру в рубине, и я хотел использовать аргумент case, чтобы определить, какая часть тела помещается в соответствии с рядом неправильных догадок. Я сделал эту игру, используя класс платы, который я использую для других игр, таких как шахматы и connect-4, потому что у меня есть метод, который сериализует класс доски, позволяющий мне сохранять и загружать игру без дополнительного кода. Чтобы игра была сохранена, мне нужен был способ определения количества неправильных догадок для палача без добавления дополнительных переменных в класс платы. Чтобы решить эту проблему, я использовал переменную экземпляра на классе платы, называемую историей, которая может использоваться для перемещения движений из игры в историю досок. Когда плата становится сериализованной, история также сохраняется, что может быть прочитано в игре и используется для определения неправильных догадок.

В игре палача у меня есть метод, называемый историей чтения (который я использую для всех игр, так как он решает проблему сериализации, описанную выше). Метод read_history отвечает за чтение прошлых догадок, отображение их и определение количества неправильных догадок. Затем это число передается методу зависания, который определяет, какие части тела палача добавить.

def hang(incorrect)
    case incorrect
    when 0 
        @hangman = ["   ", "   ", "   "]
        break
    when 7 
        @hangman[2][2] = '\\'
    when 6
        @hangman[2][0] = '/'
    when 5
        @hangman[2][1] = '*'
    when 4
        @hangman[1][2] = '\\'
    when 3
        @hangman[1][0] = '/'
    when 2 
        @hangman[1][1] = '|'
    when 1
        @hangman[0][1] = 'o'
    end
end

Если бы я писал это в java, и значение 5 было передано вышеописанному методу, он бы прочитал инструкцию до тех пор, пока не ударит "когда 5" или в java-терминах "случай 5:". Он заметил бы, что в заявлении нет разрыва и будет перемещаться по списку, выполняющему код в "case 4:", и повторяться до тех пор, пока не будет найден разрыв. Если 0 были переданы, то он выполнил бы код, посмотрел бы разрыв и не выполнил бы и другие утверждения.

Мне интересно, сможет ли Ruby использовать аргументы case так, как это делает Java, таким образом, что они попадают в следующий оператор. Для моей конкретной проблемы я знаю, что я могу использовать цикл 0.upto(неправильный) и запускать такие случаи, но я хотел бы знать сходства и различия в аргументе case, используемом в ruby, а не в случае switch-case используется в java

Ответ 1

Он не проваливается.

Ruby просто не имеет такого же поведения, как Java для этого типа утверждения.

Если вы хотите моделировать падение поведения, вы можете сделать что-то вроде этого:

def hang(incorrect)
    @hangman = ["   ", "   ", "   "]
    @hangman[2][2] = '\\' if incorrect > 6
    @hangman[2][0] = '/' if incorrect > 5
    @hangman[2][1] = '*' if incorrect > 4
    @hangman[1][2] = '\\' if incorrect > 3
    @hangman[1][0] = '/' if incorrect > 2
    @hangman[1][1] = '|' if incorrect > 1
    @hangman[0][1] = 'o' if incorrect > 0

    @hangman
  end

Ответ 2

Нет, оператор case Ruby не проходит, как Java. Выполняется только один раздел (или другой). Однако вы можете перечислить несколько значений в одном совпадении, например. как этот сайт показывает.

print "Enter your grade: "
grade = gets.chomp
case grade
when "A", "B"
  puts 'You pretty smart!'
when "C", "D"
  puts 'You pretty dumb!!'
else
  puts "You can't even use a computer!"
end

Он функционально эквивалентен гигантскому if-else. Code Academy на нем рекомендует использовать запятые, чтобы предлагать несколько вариантов. Но вы все равно не сможете выполнить более одной ветки логики.