Что такое чистый способ определения массива строк в Ruby? - PullRequest
4 голосов
/ 29 августа 2011

Допустим, по какой-то причине я собираюсь определить переменную массива в файле сценария ruby, который содержит все штаты США в виде строк. Что такое чистый способ сделать это? И по чистоте, я не особо ищу производительность, но больше удобочитаемости.

Вот несколько способов, которые я пробовал, но мне не очень нравится:

Определение строки LONG . Меня это не волнует, потому что он очень длинный или должен быть завернут в слова.

states = ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", ...]

Другой вариант - определение нескольких строк, отправка строк в массив. Это разрешает длинные строки (по ширине), но меня не волнует смешанное использование присваивания и array.push.

states = ["Alabama", "Alaska", "Arizona"]
states.push("Arkansas", "California", "Colorado")
states.push("...")

Еще один вариант - однострочные толчки. Это кажется последовательным, но может быть довольно долгим для выполнения.

states = []
states.push("Alabama")
states.push("Alaska")
states.push("Arizona")
states.push("...")

Теперь, конечно, в идеале, я бы не стал жестко кодировать значения моего массива и должен был бы извлекать их из базы данных или веб-службы и т. Д. Но для цели вопроса давайте предположим, что значения не существуют где-нибудь еще в настоящее время.

Ответы [ 5 ]

8 голосов
/ 29 августа 2011

В ruby ​​есть фактический синтаксический элемент для определения таких массивов:

> states = %w(Alabama Alaska Arizona
>    Arkansas California
>    Colorado)
=> ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado"]

Обратите внимание, что он будет разбивать элементы на пустое пространство. Таким образом, запись типа «Северная Дакота» будет состоять из двух элементов: «Северная» и «Дакота».

3 голосов
/ 29 августа 2011

Вы можете построить свои данные с помощью строки:

states = %{Alabama
  Alaska
  Arizona
  Arkansas
  California
  Colorado
  Nort Carolina
}.each_line.map{|s| s.strip}

p states

Преимущество: Вы можете сохранить свои данные в текстовом файле.

states = states = File.readlines('countries.txt').map{|s| s.strip}

И country.txt:

Alabama
Alaska
Arizona
Arkansas
California
Colorado
Nort Carolina
3 голосов
/ 29 августа 2011

Просто поместите их в несколько строк, если хотите ...

states = ["Alabama",
          "Alaska",
          "Arizona",
          "Arkansas",
          "California",
          "Colorado",
          ...]

Ключ заключается в том, чтобы заканчивать строки запятыми.Следующее не будет работать:

# Does not work!
states = ["Alabama"
          ,"Alaska"
          ,"Arizona"
          ,"Arkansas"
          ,"California"
          ,"Colorado"
          ...]
2 голосов
/ 29 августа 2011

Используйте этот трюк, вы найдете его, чтобы решить проблему довольно аккуратно.

ruby-1.9.2-p290 :001 > text =  %w( hello yo wazzap
ruby-1.9.2-p290 :002]> hi
ruby-1.9.2-p290 :003]> hello)
 => ["hello", "yo", "wazzap", "hi", "hello"] 
ruby-1.9.2-p290 :004 > text
 => ["hello", "yo", "wazzap", "hi", "hello"] 

Я мог бы также предложить сохранить данные по отдельным строкам в файле, который затем можно сгенерировать в виде массива с помощью простой команды:

array = File.readlines('input.txt')
0 голосов
/ 30 августа 2011

Предполагая, что состояния (значения массива) НЕ ДОЛЖНЫ быть определены в самом файле сценария, основываясь на всех других предоставленных ответах, я бы, вероятно, сохранил бы состояния в отдельном файле, разделенном запятыми, и сделал бы это

states = File.read('states.txt').split(',')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...