私は最近、Rubyで構造体を使用してクラスを作成する方法2つのアプローチました:構造体からクラスを作成するさまざまなアプローチの違いは何ですか?
Customer = Struct.new(:name, :address) do
# ...
end
class Customer < Struct.new(:name, :address)
# ...
end
をこれらのアプローチの違いは何ですか?
私は最近、Rubyで構造体を使用してクラスを作成する方法2つのアプローチました:構造体からクラスを作成するさまざまなアプローチの違いは何ですか?
Customer = Struct.new(:name, :address) do
# ...
end
class Customer < Struct.new(:name, :address)
# ...
end
をこれらのアプローチの違いは何ですか?
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の回答も参照してください。
祖先鎖には多少の違いがあります。
まず例:
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
が定義の範囲の変数にアクセスする方法にも違いがあります - @Зеленыйの答えを参照してください。