2012-02-01 65 views
7

例如为什么ruby方法不具有词法范围?

def test 
    a = "a is for apple" 
    def inner_method 
     a = "something" # this will refer to a different "a" 
    end 

    inner_method 
    puts a 
end 

是否有这方面的任何原因?块有词法范围,所以为什么不用方法?这会被修复吗?

回答

11

这是因为Ruby的方法不是一流的对象(例如,它们将在IO中)。所以当你定义内部方法时,接收器是什么?大概是方法本身,或者是绑定什么的,但是Ruby没有那么深的OO。

无论如何,我不清楚你在你的例子中预计会发生什么,你是否想要它修改本地变量a?如果是这样,一个proc是一种方法的合适替代品。

def test 
    a = "a is for apple" 
    inner_method = lambda do 
    a = "something" 
    end 

    a # => "a is for apple" 
    inner_method.call 
    a # => "something" 
end 

test 

functional.rb”是这种编程风格的更奢侈的例子。

而“lambda, proc, and Proc.new”是Ruby不同类型闭包的细分。

+0

当一切都有词汇范围时,它似乎不合适。 – 2012-02-01 01:30:27

+5

“其他”?除了块以外,*没有*具有词汇范围。不是方法体。不是班级机构。不是模块主体。不是脚本主体。 *块*是“不合适的”。 – 2012-02-01 03:42:54

+3

斯卡拉的方法不是一流的对象,但内部方法关闭其周围方法的环境。 “内部方法”不能通过外部方法关闭的原因有一个更简单的原因:因为它*不是“内部方法”。这是一个全局方法的定义。 – 2012-02-01 03:46:00

相关问题