добавление перечисления с пробелами в коллекцию rails

#ruby

#ruby

Вопрос:

 irb(main):001:0> t = %w{this is a test}
=> ["this", "is", "a", "test"]
irb(main):002:0> t.size
=> 4
irb(main):003:0> t = %w{"this is" a test}
=> [""this", "is"", "a", "test"]
irb(main):004:0> t.size
=> 4
  

В итоге я ожидал, что t.size будет 3.

Как и предлагалось, каждый пробел должен быть экранирован …что, оказывается, требует много работы. Какие еще есть варианты? У меня есть список примерно из 30 слов, которые мне нужно поместить в коллекцию, потому что я показываю их в виде флажков, используя simple_form

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

1. Какие еще примеры у вас есть? Заключены ли они в двойные кавычки там, где вы не хотите, чтобы их разделяли? Вероятно, есть способ получше, чем использование %w{} , и для того, чтобы помочь вам, нам нужно знать общую схему.

2. Это плохой программный дизайн — настаивать на использовании чего-то вроде %w{} оператора, а затем пытаться обмануть его, когда есть другие, лучшие способы сделать это. Конечный результат попытки заставить %w{} делать то, для чего он не предназначен, вызывает путаницу при поддержании кода.

Ответ №1:

Почему бы просто не использовать обычный массив, чтобы никому не приходилось визуально анализировать все экранирующие элементы, чтобы выяснить, что происходит? Это довольно ясно:

 t = [
    'this is',
    'a',
    'test'
]
  

и люди, поддерживающие ваш код, не будут ненавидеть вас за использование %w{} , когда это неуместно или когда они все испортили, потому что не увидели ваш экранированный пробел.

Ответ №2:

Вам нужно экранировать пробел символом », например t = %w{this is a test} , если вы не хотите, чтобы это пространство было разделителем.

Ответ №3:

Освободите пробел с помощью :

 %w{this is a test}
  

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

1. У меня есть куча слов, которые я пытаюсь получить в виде коллекции. есть ли способ лучше?

2. Почему бы вместо этого не использовать массив или текстовый файл

Ответ №4:

Вы можете избежать пробела, %w{this is a test} чтобы получить ['this is', 'a', 'test'] , но в целом я бы не стал использовать %w , если только тогда не предполагается разделение на пробелы.

Ответ №5:

Как указывали другие, используйте %w{} конструкцию, когда пробелы являются разделителем для слов. Если у вас есть элементы, которые необходимо заключить в кавычки, и вы все еще хотите использовать конструкцию, вы можете сделать:

  > %w{a test here}.unshift("This is")  
 => ["This is", "a", "test", "here"] 
  

Ответ №6:

 require 'csv'
str = '"this is" a test'
p CSV.parse_line(str,{:col_sep=>' '})
#=> ["this is", "a", "test"]