Это то, что я имею сейчас - это выглядит слишком многословно для работы, которую он делает.
@title = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?
Предположим, токены - это массив, полученный путем разбиения строки CSV. теперь функции как полоса! грызть! и др. все возвращают ноль, если строка не была изменена
"abc".strip! # => nil
" abc ".strip! # => "abc"
Как Ruby может сказать обрезать его, если он содержит дополнительные начальные или конечные пробелы без создания копий?
Становится хуже, если я хочу сделать tokens[Title].chomp!.strip!
Ответы:
Я думаю, что вы хотите, это:
#strip!
Метод будет возвращать ,nil
если он ничего не раздеться, а сама переменная , если она была лишена.Согласно стандартам Ruby, метод с суффиксом с восклицательным знаком изменяет переменную на месте.
Надеюсь это поможет.
Обновление: это выходные данные
irb
для демонстрации:источник
@title.tap &:strip!
? Это кажется чище, чем все остальное.nil
если бы оно ничего не раздевало? Это, без сомнения, смутило тонну людей (поскольку это не имеет смысла).Кстати, теперь ruby уже поддерживает просто полосу без "!".
Для сравнения:
Также невозможно
strip
без дубликатов. Смотрите источники в string.c:ruby 1.9.3p0 (2011-10-30) [i386-mingw32]
Обновление 1: как я вижу сейчас - он был создан в 1999 году (см. Rev # 372 в SVN):
Update2:
strip!
не будет создавать дубликаты - как в версии 1.9.x, 2.x, так и в транке.источник
strip!
.strip
. Я что-то неправильно понимаю? Как еще я могу интерпретировать «невозможно раздеть без дубликата»?strip!
акаrb_str_strip_bang
.Нет необходимости в раздевании и сжатии, поскольку раздевание также удаляет завершающие возвраты каретки - если только вы не изменили разделитель записей по умолчанию, и это то, что вы грызете.
Ответ Олли уже имеет канонический способ сделать это в Ruby, хотя, если вы делаете это часто, вы всегда можете определить метод для этого:
Предоставление:
Также имейте в виду, что оператор if будет препятствовать
@title
назначению, если токен равен nil, что приведет к тому, что он сохранит свое предыдущее значение. Если вы хотите или не возражаете против того,@title
чтобы вас всегда назначили, вы можете перенести проверку в метод и еще больше уменьшить дублирование:В качестве альтернативы, если вы чувствуете себя предприимчивым, вы можете определить метод для самой String:
Предоставление одного из:
источник
Если вы используете Ruby on Rails, есть слабость
Если вы используете только Ruby, вы хотите использовать полосу
В этом и заключается ошибка ... в вашем случае вы хотите использовать полосу без взрыва!
пока раздевайся! конечно, возвращает ноль, если не было никаких действий, он все равно обновляет переменную, так что удалите! не может быть использован inline. Если вы хотите использовать strip inline, вы можете использовать версию без преувеличения!
полоса! используя многострочный подход
Стрип однострочный подход ... ВАШ ОТВЕТ
источник
Я думаю, что ваш пример - разумный подход, хотя вы могли бы немного его упростить:
Альтернативно вы можете поставить его на две строки:
источник
Если вы хотите использовать другой метод после того, как вам нужно что-то вроде этого:
Таким образом, вы можете раздеться и сделать что-нибудь после :)
источник
Мой путь:
источник
Если у вас есть ruby 1.9 или activesupport, вы можете просто
Это действительно здорово, так как он использует
:try
и:tap
метод, которые являются наиболее мощные функциональные конструкции в рубин, на мой взгляд.Четная милая форма, передавая функции в целом как символы:
источник
Вполне возможно, я не понимаю тему, но разве это не сделает то, что вам нужно?
источник