Создание массива в Ruby - PullRequest
2 голосов
/ 18 июня 2020

Я пытаюсь создать массив в Ruby. Когда моя функция вызывается для печати массива, кажется, что массив не определен. Мне интересно, отключен ли мой синтаксис.

Кто-нибудь, пожалуйста, скажите мне, является ли это правильным способом создания и инстанцирования массива в одной строке, или проблема в другом месте моего кода?

Ниже мой Ruby код:

    class Game         

        words = Array["hat", "cat", "ate", "run", "eye", "soup", "date",
              "bake", "wake", "grape", "apple", "pride", "drive",
               "tacos", "linux", "orange", "purple", "volume", 
               "liquid", "palace", "molasses", "diamond", "sausage",
               "america", "england"]    


         # starts the game state to play
         def start_x
             #  game logic for begin
             puts(words)
         end

        # if users wins
        def win
             puts("congratulations! you win!")

        end

        # if user loses 
        def death
            puts("sorry! you die!")

         end



   end

Ответы [ 3 ]

2 голосов
/ 18 июня 2020

Вам нужно либо преобразовать words в WORDS, либо сделать эти значения доступными с помощью метода получения или переменной экземпляра. Вот несколько примеров:

Constantize, делая массив доступным для любого вызывающего:

class Game
  WORDS = ['hat', 'cat', 'ate', 'run', 'eye', 'soup', 'date',
    'bake', 'wake', 'grape', 'apple', 'pride', 'drive',
    'tacos', 'linux', 'orange', 'purple', 'volume', 
    'liquid', 'palace', 'molasses', 'diamond', 'sausage',
    'america', 'england']

  def start_x
    puts(WORDS)
  end
end

И тогда это работает:

⇒ Game.new.start_x
hat
cat
ate
run
eye
soup
date
bake
wake
grape
apple
pride
drive
tacos
linux
orange
purple
volume
liquid
palace
molasses
diamond
sausage
america
england

Или с помощью метода получения:

class Game
  def words
    @words ||= ['hat', 'cat', 'ate', 'run', 'eye', 'soup', 'date',
      'bake', 'wake', 'grape', 'apple', 'pride', 'drive',
      'tacos', 'linux', 'orange', 'purple', 'volume', 
      'liquid', 'palace', 'molasses', 'diamond', 'sausage',
      'america', 'england']
  end

  def start_x
    puts(words)
  end
end

Или с переменной экземпляра:

class Game
  def initialize
    @words = ['hat', 'cat', 'ate', 'run', 'eye', 'soup', 'date',
      'bake', 'wake', 'grape', 'apple', 'pride', 'drive',
      'tacos', 'linux', 'orange', 'purple', 'volume', 
      'liquid', 'palace', 'molasses', 'diamond', 'sausage',
      'america', 'england']
  end

  def start_x
    puts(@words)
  end
end

Или комбинируйте со считывателем атрибутов:

class Game
  attr_reader :words

  def initialize
    @words = ['hat', 'cat', 'ate', 'run', 'eye', 'soup', 'date',
      'bake', 'wake', 'grape', 'apple', 'pride', 'drive',
      'tacos', 'linux', 'orange', 'purple', 'volume', 
      'liquid', 'palace', 'molasses', 'diamond', 'sausage',
      'america', 'england']
  end

  def start_x
    puts(words)
  end
end

Все работают одинаково и будут использоваться в разные обстоятельства.

1 голос
/ 18 июня 2020

Ваш код не работает, потому что words - это локальная переменная , объявленная вне методов.

Вы, вероятно, захотите иметь здесь переменную экземпляра . И обычно рекомендуется отделить код игры от данных. Поэтому вместо жесткого кодирования слов в класс Game вы передаете данные при инициализации:

class Game
  def initialize(words)
    @words = words
  end

  def start_x
    puts @words
  end

  # ...
end

Чтобы вызвать его:

words = %w[
  hat cat ate run eye soup date bake wake grape apple pride drive tacos linux
  orange purple volume liquid palace molasses diamond sausage america england
]

game = Game.new(words)
game.start_x

С этого момента вы можете легко извлечь данные в файл words.txt:

hat
cat
ate
...
sausage
america
england

И загрузить данные через:

words = File.readlines('words.txt' chomp: true)

game = Game.new(words)
game.start_x

Это позволит вам запустить свой игра с разными наборами слов без изменения кода.

0 голосов
/ 18 июня 2020

Думаю, это вам поможет.

class Game
  attr_reader :words
  def initialize
    @words = %w[hat cat ate run eye soup date
                bake wake grape apple pride drive
                tacos linux orange purple volume
                liquid palace molasses diamond sausage
                america england]
  end
  # if users wins
  def win
    puts("congratulations! you win!")
  end
  # if user loses 
  def death
    puts("sorry! you die!")
  end
end

Вы можете получить доступ к таким словам, как Game.new.words

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