2016-11-26 5 views

答えて

4

Rubyは、実際にいくつかのスコープを持っています

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

module

classそれらのいくつか。

あなたが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のスーパークラスは、第二に、それは匿名クラス#<Class:0x007ff4328dddc0>だのに対し、Structクラス自体です。

Customerが定義の範囲の変数にアクセスする方法にも違いがあります - @Зеленыйの答えを参照してください。

関連する問題