2010-03-25 4 views
16

Так что я знаю в рубине, что x.nil? будет проверяться, если x равно null.Простейший способ проверить только пробелы в рубине

Каков самый простой способ проверить, если x равно '', или '' (два пробела), или '' (три пробела) и т. Д.?

В принципе, мне интересно, какой лучший способ проверить, является ли переменная пробелом?

+0

позвольте мне на самом деле прояснить мой вопрос, потому что это было не совсем понятно ... им на самом деле выполняет это в контексте, если заявление. поэтому я проверяю x.nil? и я также хочу x. (здесь есть только пробелы, поэтому я считаю это nil), чтобы оба были условно оценены – user301752

+0

@ user301752, когда вы говорите 'nil', вы имеете в виду пустую строку? Они не то же самое в Ruby. (Откройте сеанс 'irb' и проверьте:' x = ''; x.nil? '.) – Telemachus

+0

Почему бы не обрезать его первым? –

ответ

15
s =~ /^\s*$/ 

решение Regex. Вот short ruby regex tutorial.

+0

спасибо! просто начал изучать рубин и не понял, что = ~ будет условно оценивать регулярное выражение, которое довольно приятно – user301752

+0

@Stefan Я думаю, что вы хотите '/^\ s + $ /', так как '*' будет слишком много соответствовать (например, вы получаете совпадение для пустой строки - никаких пробелов вообще). – Telemachus

+0

Я считал «как все пробелы». Это может быть или не быть правильным в области проблемы, но я не думал, что вопрос был сформулирован таким образом, чтобы сделать либо * или + неправильным. –

0
a = " " 

a.each_byte do |x| 
    if x == 32 
    puts "space" 
    end 
end 
+2

Для downvoter было бы хорошо знать, что не так с ответом (или как это не полезно). – OscarRyz

+2

Я не был downvoter, но это не самое простое решение и не проверяет, чтобы 32 поймал все пробелы. – miorel

+0

Вопрос был двусмысленным в отношении того, хочет ли он пробелы или все пробельные символы (включая вкладки, символы перевода строк и т. Д.). – Chuck

5

Если x все пробелы, то x.strip будет пустая строка. Так что вы можете сделать:

if not x.nil? and x.strip.empty? then 
    puts "It's all whitespace!" 
end 

В качестве альтернативы, используя регулярное выражение, x =~ /\S/ возвратит ложь, если и только если x это все пробельные символы:

if not (x.nil? or x =~ /\S/) then 
    puts "It's all whitespace!" 
end 
+0

Почему downvote ?! –

+0

Я не спускал вниз. – miorel

+0

Младен имел в виду нисходящее движение, которое было на вашем ответе, а не обвиняло вас в том, что вы нивелировали других. – Beanish

0

Основываясь на ваш комментарий, я думаю, вы можете расширить класс String, и определить метод spaces? следующим образом:

$ irb 
>> s = " " 
=> " " 
>> s.spaces? 
NoMethodError: undefined method `spaces?' for " ":String 
    from (irb):2 
>> class String 
>>  def spaces? 
>>   x = self =~ /^\s+$/ 
>>   x == 0 
>>  end 
>> end 
=> nil 
>> s.spaces? 
=> true 
>> s = "" 
=> "" 
>> s.spaces? 
=> false 
>> 
21

«лучше» зависит от контекста, но вот простой способ.

some_string.strip.empty? 
26

Если вы используете Rails, вы можете просто использовать:

x.blank? 

Это безопасно звонить, когда х равен нулю, и возвращает истину, если х равен нулю или все пробелы.

Если вы не используете Rails, вы можете получить его от драгоценного камня activesupport. Установите с gem install activesupport. В вашем файле либо require 'active_support/core_ext, чтобы получить все активные расширения поддержки базовым классам, или require 'active_support/core_ext/string', чтобы получить только расширения класса String. В любом случае метод blank? будет доступен после запроса.

+4

Кстати, я извиняюсь перед рубистами за то, что тащил Rails в то, что было в противном случае приятным, чистым обсуждением в Ruby. Это просто хороший образец для подражания. – MikeJ

+0

@ david-miani Жаль, что я не могу изменить ваше редактирование, потому что он отличный. Это плохой вид чрезмерной оптимизации для извлечения кода из ActiveSupport, когда AS уже поддерживает, включая только те функции, которые вам нужны. – MikeJ

Смежные вопросы