Что канонический путь состоит в том, чтобы обрезать строку в Ruby, не создавая новую строку?

  • возвращают код ошибки, когда ожидается состояние ошибки , в некоторых случаях
  • выдают исключение, когда не ожидается состояние ошибки .

в первом случае вызывающая функция должна проверить код ошибки для ожидаемого сбоя; в последнем случае исключение может быть обработано любым вызывающим абонентом в стеке (или обработчиком по умолчанию), в зависимости от ситуации

178
задан Gishu 16 June 2009 в 10:43
поделиться

3 ответа

Думаю, вы хотите:

@title = tokens[Title]
@title.strip!

Метод #strip! вернет nil , если ничего не удалял, и саму переменную, если она была удалена.

Согласно стандартам Ruby, метод с суффиксом восклицательного знака заменяет переменную на место.

Надеюсь, это поможет.

Обновление: Это вывод из irb , чтобы продемонстрировать:

>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"
263
ответ дан 23 November 2019 в 20:16
поделиться

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

Ответ Оли уже имеет канонический способ сделать это в Ruby, хотя, если вы обнаружите, что делаете это часто, вы всегда можете определить для этого метод:

def strip_or_self!(str)
  str.strip! || str
end

Giving:

@title = strip_or_self!(tokens[Title]) if tokens[Title]

Также имейте в виду, что оператор if предотвратит @ title не будет назначен, если токен равен нулю, что приведет к сохранению его предыдущего значения. Если вы хотите или не возражаете против того, чтобы всегда был назначен @title , вы можете переместить проверку в метод и еще больше уменьшить дублирование:

def strip_or_self!(str)
  str.strip! || str if str
end

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

class String
  def strip_or_self!
    strip! || self
  end
end

Дает одно из:

@title = tokens[Title].strip_or_self! if tokens[Title]

@title = tokens[Title] && tokens[Title].strip_or_self!
9
ответ дан 23 November 2019 в 20:16
поделиться

Я думаю, что ваш пример является разумным подходом, хотя вы могли бы немного упростить его следующим образом:

@title = tokens[Title].strip! || tokens[Title] if tokens[Title]

Альтернативно вы можете поместить его в две строки:

@title = tokens[Title] || ''
@title.strip!
3
ответ дан 23 November 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: