Ruby идиома: вызов метода или по умолчанию - PullRequest
6 голосов
/ 30 января 2011

Как правильно делать это в Ruby?

def callOrElse(obj, method, default)
  if obj.respond_to?(method) 
     obj.__send__(method)
  else 
     default
  end
end

Ответы [ 4 ]

4 голосов
/ 30 января 2011

Поскольку он не был предложен в качестве ответа:

result = obj.method rescue default

Как и в случае с @slhck, я, вероятно, не стал бы использовать это, если бы знал, что существует разумный шанс, что obj не ответит наметод, но это вариант.

3 голосов
/ 30 января 2011

То есть вы хотите что-то похожее на x = obj.method || default? Ruby - это идеальный язык для построения собственных восходящих конструкций:

class Object
  def try_method(name, *args, &block)
    self.respond_to?(name) ? self.send(name, *args, &block) : nil     
  end
end

p "Hello".try_method(:downcase) || "default" # "hello"
p "hello".try_method(:not_existing) || "default" # "default"

Может быть, вам не нравится этот косвенный вызов с символами? нет проблем, тогда посмотрите на стиль Ick * maybe и используйте прокси-объект (вы можете выяснить реализацию):

p "hello".maybe_has_method.not_existing || "default" # "default"

Примечание: я не эксперт по ООП, но, насколько я понимаю, вы должны заранее знать, имеет ли объект, который вы вызываете, такой метод. Или nil объект, которым вы хотите управлять, чтобы не отправлять методы? В этом случае Ick уже хорошее решение: object_or_nil.maybe.method || default

2 голосов
/ 30 января 2011

Я бы, наверное, пошел на

obj.respond_to?(method) ? obj.__send__(method) : default
0 голосов
/ 27 марта 2019

Вы можете сделать что-то вроде этого:

object&.method(n) || 'default'

'&' действует здесь как «Возможно».Может быть, что-то есть, а может и нет.Конечно, если этого не произойдет, он просто вернет nil и не будет запускать метод, следующий за ним.

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