Почему я не могу запустить этот файл ruby?

#ruby

#ruby

Вопрос:

Я на Ubuntu. У меня есть файл ruby, который выглядит следующим образом.

 class Hangman
  def initialize
    @letters = ('a'..'z').to_a
    @word = words.sample
  end

  def words
    [
      ['cricket', 'A game played by gentlemen'],
      ['Something', 'A cool sentence'],
      ['house', 'This is getting tiring'],
      ['ruby', 'Science has created'],
      ['blah ', 'This is the last one'],
    ]
  end

  def begin
    #ask user for a letter
    puts `new game started... your clue is #{ @word.first }`
    guess = gets.chomp

    puts "You guessed #{guess}"
  end

end

game = Hangman.new
game.begin
 

Этот файл ruby называется «play.rb» в моей текущей директории. Я проверяю свой текущий рабочий каталог и получаю

 /home/ray/Documents/Projects/hangman-game
 

Теперь я хочу запустить этот код, выполнив следующее

 ruby play.rb
 

Однако это не работает. Это ошибка, которую я получаю.

 play.rb:19:in ``': No such file or directory - new (Errno::ENOENT)
        from play.rb:19:in `begin'
        from play.rb:28:in `<main>'
 

Я уверен, что файл есть. Я не понимаю, почему он не работает. Кто-нибудь видел эту проблему? Также я использую Ruby 3.0.

Комментарии:

1. Совет: для неизменных вещей определите константы, как WORDS = [ ... ] было бы лучше. Каждый раз, когда вы вызываете words , вы генерируете кучу мусора, кучу массивов и строк, которые не нужны. В этой тривиальной программе это, вероятно, не проблема, но это плохая привычка.

2. Также было бы удобнее, если бы вы это сделали @word, @hint = words.sample .

Ответ №1:

В строке 19 вы используете `` обратные метки, а не кавычки. Обратные кнопки выполняют строку в командной строке и возвращают результат в виде строки: попробуйте заменить ее на pwd или ls . Но здесь вам нужны двойные кавычки "" .

В сообщении об ошибке есть несколько подсказок, которые помогут вам определить, в чем проблема:

  • номер строки определяет строку,
  • оператор возврата идентифицируется как вызов метода, в котором возникает ошибка, и
  • «Нет такого файла или каталога — new (Errno::ENOENT)» указывает, что система пытается найти команду с именем new — первое слово в этой строке.

Комментарии:

1. О боже! Хороший глаз. Я так много работал с Javascript, что не видел в этом ничего плохого на ruby. Спасибо!

2. @this.R.A : обратные знаки в Javascript — это двойные кавычки в Ruby. Интерполяция в Javascript ( ${...} ) выполняется #{....} в Ruby.

Ответ №2:

Заменить:

 puts `new game started... your clue is #{ @word.first }`
 

Для:

 puts "new game started... your clue is #{ @word.first }"
 

Ответ №3:

Вы используете обратные пометки для сообщения, которое хотите отобразить, но в ruby, которое интерпретируется как оценка команды, вместо этого используйте двойные кавычки.

Измените это:

 `new game started... your clue is #{ @word.first }`
 

Для этого:

 "new game started... your clue is #{ @word.first }"