Может ли Ruby ничего не вернуть? - PullRequest
18 голосов
/ 11 марта 2011

Могу ли я вернуть ничего в рубине?

Только для образовательных целей

Например:

myarray = [1,2,3]
myarray << some_method

def some_method
  if Date.today.day > 15
    return "Trololo"
  else
    return __NOTHING__
  end
end

Так что если сегодня 11 'Март myarray не добавит новый предмет.Я не хочу nil - потому что nil не является ничем:)

И я понимаю, что могу использовать выражение if | unless как myarray << some_method if some_method и т. Д. Я хочу понять, могу ли я вернуть ничего или каждый раз, когда в ruby ​​я возвращаю что-то (минимум, что я могу получить, это Nil Object)

Ответы [ 6 ]

21 голосов
/ 11 марта 2011

По сути, вы ищете оператор .Но у Ruby нет операторов, только выражения . Все является выражением, т.е. все возвращает значение.

10 голосов
/ 11 марта 2011

Нет, вы не можете ничего вернуть.В ruby ​​вы всегда что-то возвращаете (даже если это просто nil) - никак не обойтись.

5 голосов
/ 11 марта 2011

Вы не можете вернуть настоящее Ничто с Руби.Все является объектом.Но вы можете создать фальшивое Ничто, чтобы сделать это.См .:

Nothing = Module.new # Same as module Nothing; end
class Array
  alias old_op_append <<
  def <<(other)
    if other == Nothing
      self
    else
      old_op_append(other)
    end
  end
end

Это ужасно, но работает в вашем образце.(Ничто не продолжает быть объектом.)

5 голосов
/ 11 марта 2011

Вы не можете вернуть "ничто" из метода в ruby.Как вы указали, вы можете условно добавить элементы в ваш массив.Вы также можете вызвать .compact в вашем массиве, чтобы удалить все элементы nil.

2 голосов
/ 11 марта 2011

Ничто не значит что-либо для ruby ​​из того, что я знаю :) Вы можете определить свое собственное ничто, хотя и выбросить его как можно больше. В ruby, если вы явно не возвращаете что-либо, возвращается последнее вычисленное выражение.

0 голосов
/ 05 февраля 2014

Вы можете смоделировать Ничто с исключениями.

class NothingError < RuntimeError  
end  

def nothing
  raise NothingError
end

def foo x
  if x>0 then x else nothing end
end

def nothingness
  begin
    yield
  rescue NothingError
  end
end

a = [1,2,3]
nothingness { a << foo(4) }
nothingness { a << foo(0) }

Возможно, это не очень хорошая идея ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...