2010-02-19 2 views
1

В рубина, что это лучший/самый элегантный способ для возвращения значения, такие как:Написание лучше Ruby: как отличить объекты от ложных или истинных?

#method returns true or false if 'do i match' is present in string 
def method(str) 
    str =~ /do i match/ 
end 
+2

Что случилось с кодом, как это? Он возвращает правдивое значение, когда оно соответствует, и ложное в противном случае. Когда вы ожидаете логическое значение, вы не должны использовать '== true' или' == false' в любом случае. – rampion

+0

возвращает 0 или нуль. Я думаю, что он должен возвращать истинное или ложное, довольно стандартное соглашение ... везде? Плюс я не использую == true, такие как [statement] if method? находятся. Кажется гораздо лучше, чем помнить, если API, который я написал, возвращает значения арбитража, а затем нахожу то, что они есть, а затем записывает логику, такую ​​как метод? .zero? – Zombies

+2

Но я считаю, что в рубине все, кроме nil и false, является правдивым (даже 0! Даже пустая строка!), Поэтому, как ваш метод стоит, «puts» я работаю! » if method ('do i match') 'будет печатать" Я работаю! ". Не нужно «.zero?». – rampion

ответ

6

бы сделать некоторые люди:

def foo 
    !!(str=~/do i match/) 
end 

# or 

def foo 
    match = str=~/do i match/ 
    !!match 
end 

Второй ! проходит испытание truthiness и сводит на нет ответ, тогда первый ! снова отрицает его, чтобы получить исходный правдивый результат.

я предпочел более явный синтаксис:

def foo 
    str =~ /do i match/ ? true : false 
end 

Это делает truthiness, но мне кажется более ясным. Делайте то, что кажется вам самым чистым.

4

Я могу быть еретиком за это, но я думаю, что они неявные возвращения прекрасны. В этом случае он оценивает значение true или false, но я вижу, как люди могут думать, что это неясно.

Вы можете сохранить неявное возвращение и сделать это вместо:

str =~ /do i match/ ? true : false 
2

компромисс между читаемость и производительность

!str.match(/do i match/).nil? 
+1

Не могли бы вы заменить '!' На 'not'? –

+1

Использование «не» в этом конкретном экземпляре было бы в порядке, но между ними есть разница в приоритете! и не. Попробуйте «puts! True» и «puts not true». – Trevoke

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