2016-11-26 80 views

回答

4

红宝石实际上有几个范围:

# scope one, opened with `module` keyword 
module ... 
    # scope two, opened with `class` keyword 
    class ... 
    end 
end 

moduleclass其中的一些。

当你正在使用的第一个例子,你能够共享范围访问f变量,它是非常方便的在某些情况下:

=> f = 1 
=> 1 
=> Customer = Struct.new(:a) do 
=> puts f 
=> end 
=> 1 
=> #<Customer:0x005561498351f8> 

随着第二个例子中,你不能访问f可变变量:

=> f = 1 
=> class Customer < Struct.new(:a) 
=> puts f 
=> end 
#> NameError: undefined local variable or method `f' for Customer:Class 

祖先链中还有一个区别 - 请参阅@ AndreyDeineko的答案。

4

有些区别在于祖先连锁店。

第一个例子:

Customer.ancestors 
#=> [Customer, Struct, Enumerable, Object, PP::ObjectMixin, Kernel, BasicObject] 

第二个例子:

Customer.ancestors 
#=> [Customer, #<Class:0x007ff4328dddc0>, Struct, Enumerable, Object, PP::ObjectMixin, Kernel, BasicObject] 

所以在第一个例子Customer的超是一个Struct类本身,而在第二,它是一个匿名类#<Class:0x007ff4328dddc0>

这两个Customer可以如何访问其定义范围的变量也有区别 - 请参阅@Зеленый的答案。

相关问题