红宝石中有“可驯服”的东西吗?

时间:2016-05-05 09:58:49

标签: ruby

在python中,我可以使用“callable”来检查是否可以调用变量。像这样:

# -*- coding: utf-8 -*-


def test():
    print "hello world"

a = test
if callable(a):
    a()

所以这样,我可以告诉a是一个函数,而不是一个实例变量。 但是在ruby中,大括号可以省略,所以对我来说,当我调用它时,我无法判断它是函数还是实例变量。是否有一些方法可以在运行时检查变量是函数还是实例变量?

3 个答案:

答案 0 :(得分:6)

是。 defined?为您提供所谓的内容。

a = 1
def a; end
b = 1
def c; end

defined? a   # => "local-variable"
defined? a() # => "method"
defined? b   # => "local-variable"
defined? c   # => "method"

答案 1 :(得分:2)

开箱即用的ruby中不允许使用此语法。这是因为在函数调用中可能省略括号,并且ruby解析器没有机会理解您要调用“ callable ”而不是仅仅解决它。最简单的解决方法可能是:

▶ λ = ->(param) { puts param }
#⇒ #<Proc:0x00000004e93050@(pry):7 (lambda)>
▶ λ.call(5) if λ.respond_to? :call
#⇒ 5

有一个特定的角落案例ruby blocks。响应to_proc方法的所有内容都可以作为代码块传递给任何接受代码块的方法,并且将隐式调用该块。

E.g:

▶ [1,2,3].each &λ
#⇒ 1
#⇒ 2
#⇒ 3

答案 2 :(得分:0)

在 ruby​​ 中,一个变量是可调用的,如果它响应 #call

def callable(obj)
  obj.respond_to? :call
end