Почему я получаю синтаксическую ошибку с "Sinatra: Up and Running" game.rb "Rock Paper Scissors"? - PullRequest
2 голосов
/ 30 декабря 2011

Я следую этому примеру из "Sinatra: Up and Running", и получаю следующее сообщение об ошибке:

game.rb: 8: список нечетных чисел для Hash@defeat = {камень:: ножницы, бумага:: камень, ножницы:: бумага}^game.rb: 8: синтаксическая ошибка, неожиданное ':', ожидание '}'@defeat = {камень:: ножницы, бумага:: камень, ножницы:: бумага}^

после запуска:

$ ruby -rubygems game.rb

Однако я понятия не имею, почему возникает проблема с этим утверждением.Я скопировал код прямо из книги.Я перепробовал много вариантов, и ничего не работает.Предполагается, что этот код выведет: «О, скала бьет ножницами. Удачи в следующий раз!»если я перейду к localhost: 4567 / throw / scissors и компьютер выберет рок.

game.rb ниже

require 'sinatra'

# before we process a route, we'll set the response as
# plain text and set up an array of viable moves that
# a player (and the computer) can perform
before do
  content_type :txt
  @defeat = {rock: :scissors, paper: :rock, scissors: :paper}
  @throws = @defeat.keys
end

get '/throw/:type' do
  # the params[] hash stores querystring and form data.
  player_throw = params[:type].to_sym

  # in the case of a player providing a throw that is not valid,
  # we halt with a status code of 403 (Forbidden) and let them
  # know they need to make a valid throw to play.
  if !@throws.include?(player_throw)
    halt 403, "You must throw one of the following: #{@throws}"
  end

  # now we can select a random throw for the computer
  computer_throw = @throws.sample

  # compare the player and computer throws to determine a winner
  if player_throw == computer_throw
    "You tied with the computer. Try again!"
  elsif computer_throw == @defeat[player_throw]
    "Nicely done; #{player_throw} beats #{computer_throw}!"
  else
    "Ouch; #{computer_throw} beats #{player_throw}. Better luck next time!"
  end
end

Кстати, код, который я использовал для исходного вопроса, на самом деле был одиниз "исправлений" я попробовал не фактический код книги.Видимо, в коде книги было то же самое, что предложил скзиццо.Тем не менее, я все еще получаю сообщение об ошибке (см. Выше).В любом случае, если я попробую альтернативу sczizzo:

{: камень =>: ножницы,: бумага =>: камень,: ножницы =>: бумага}

, затем game.rb компилируется, но я получаюошибка выполнения:

#

если я зайду http://localhost:4567/throw/scissors

Решение: Instal Ruby 1.9! Спасибо всем

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Я думаю, что они имели в виду @defeat = { rock: :scissors, paper: :rock, scissors: :paper }. Теперь используется хэш Ruby нового стиля, который также может быть записан так: { :rock => :scissors, :paper => :rock, :scissors => :paper }.

0 голосов
/ 30 декабря 2011

Ошибка объясняет, где проблема.Если вы вставите определение для @defeat в IRB:

1.9.2p290 :002 > @defeat = {rock :scissors, paper :rock, scissors :paper}
SyntaxError: (irb):2: syntax error, unexpected tSYMBEG, expecting keyword_do or '{' or '('
@defeat = {rock :scissors, paper :rock, scissors :paper}
                 ^

Вы можете исправить это, следуя ответу @ sczizzo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...