#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"]