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

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

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

Например:

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)

Ответы

Ответ 1

В принципе, то, что вы ищете, - это утверждение. Но Ruby не имеет операторов, а только выражений. Все это выражение, т.е. Все возвращает значение.

Ответ 2

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

Ответ 3

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

Ответ 4

Вы не можете вернуть реальное Nothing с Ruby. Все это объект. Но вы можете создать подделку. Ничего не сделать. См:

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

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

Ответ 6

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

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) }

Наверное, это не отличная идея...