Ruby “的快捷方式”;如果定义了方法,则指定方法结果,否则为默认值;红宝石色

Ruby “的快捷方式”;如果定义了方法,则指定方法结果,否则为默认值;红宝石色,ruby,Ruby,在Ruby赋值中,可以方便地检查方法是否返回值,如果不返回值,则提供默认值: my_var = foo() || my_default 是否有类似的快捷方式来检查该方法是否首先存在?也就是说,这是一个较短的版本: my_var = if defined? foo foo() else my_default end 或者这个: my_var = defined?(foo) ? foo() : my_default

在Ruby赋值中,可以方便地检查方法是否返回值,如果不返回值,则提供默认值:

my_var = foo() || my_default
是否有类似的快捷方式来检查该方法是否首先存在?也就是说,这是一个较短的版本:

my_var = if defined? foo
           foo()
         else
           my_default
         end
或者这个:

my_var = defined?(foo) ? foo() : my_default
后一个版本并不可怕,但当方法、变量名和默认值变长时,它会变得很笨拙:

resource_list = defined?(resource_list_override) ? resource_list_override() : [Resource.new(uri: 'http://example.org/'), Resource.new(uri: 'http://example.com/')]

如果存在这样的情况,我想将其归结为不重复方法名称的内容。

默认情况下没有一种干净的方法可以做到这一点,但您可以实现类似于
存在的功能

class Object
  def call_default(method_name, default)
    self.respond_to?(method_name) ? self.send(method_name) : default
  end
end

my_var = call_default :foo, my_default
或者,如果您可能需要向方法发送参数:

class Object
  def call_default(method_name, *args, default)
    self.respond_to?(method_name) ? self.send(method_name, *args) : default
  end
end

my_var = call_default :foo, 'bar', 'baz', my_default

你可以写一个小方法来做这个

def do_or_default(method, default)
  eval(method.to_s)
rescue NameError
  return default
end
将要测试的方法作为符号传递

def return_hello
  "hello"
end

# method return_hello exists...
p do_or_default(:return_hello, "goodbye")
=> "hello"

# method return_howdy doesn't exist...
p do_or_default(:return_howdy, "goodbye")
=> "goodbye" 

使用
eval
通常是可以避免的,但有时也无济于事。如果要测试的方法是由用户提供的,那么您不想使用它。

您使用的是Rails还是straight Ruby?Rails有
存在
my_var=foo.presence | | my_default
。纯Ruby,唉。但是
false。presence
nil
,所以它不太有效。我认为三元是唯一与CoffeeScript的
或Perl的
/
相当的Ruby。这是好的观点,但我完全误解了这个问题。现在编辑。是的,因为我没有抓住它作为一种方法的全部内容。:-/很抱歉我现在正在更新它。作为一个问答写作风格的东西,没有必要,或者特别需要加上“编辑…”。如果我们在意,我们可以看到您何时编辑了某些内容。与其这样做,不如简单地将你的新信息添加到你的文本中,如果你把它放在原来的位置。堆栈溢出的目标是像一本百科全书或烹饪书,换句话说就是一本参考书。你多久会看到一次包含“编辑…”的参考书?是的,问题是,
presence
试图将错误概括为比Ruby已经包含的更多,但我们想要一个更窄的版本。考虑<代码> []。存在< <代码> >代码> {}。我认为
x.nil??y:x
是最接近CoffeeScript的红宝石吗?y
(但咖啡脚本中同时存在
未定义的
null
响应?
是一种核心Ruby方法。噢,我的错,@SeanHill