2015-12-05 51 views
1

大多數網上材料具有初始化是這樣的:實例初始化以哈希

class MyClass 
    attr_accessors :a, :b, :c 
    def initialize(a,b,c) 
    @a = a 
    @b = b 
    @c = c 
    end 
end 

有或沒​​有默認值。創建一個新的實例是:

n = MyClass.new(1,2,3) 
n.a # => 1 
n.b # => 2 
n.C# => 3 

我想知道如何使用哈希語法初始化實例,如:

n = MyClass.new(:a => 1, :b => 2, :c => 3) 

這應該是等同於:

n = MyClass.new(:b => 2, :a => 1, :c => 3) 

是這很難實現?

回答

9

使用Ruby的關鍵字參數,用Ruby 2.0提供及以上的初始化參數

格式爲variable:

class MyClass 
    attr_accessors :a, :b, :c 
    def initialize(a:, b:, c:) 
     @a = a 
     @b = b 
     @c = c 
    end 
    end 
+0

你可能會認爲這是顯而易見的,但我沒能得到這個語法沒有把在默認設置(即工作:'高清初始化(一:nil,b:4,c:foo)'。感謝您的幫助。 –

+0

所以,讓我知道這是不是基於。當你添加命名參數他們是要求,你必須通過所有的人。如果你沒有通過它們,初始化新類將失敗 – Austio

+0

我在註釋中列出了它的方式,我沒有。省略參數用默認值初始化。你在IDE上面列出的方式抱怨意想不到的逗號,並且這個應用程序會引起一片神祕例外。它想要'''之後和''之前的東西。 –

0

您是否在尋找下?

class MyClass 
    attr_accessor :hash 
    def initialize(hash) 
    @hash = hash 
    end 
end 

e1 = MyClass.new(:a => 1, :b => 2, :c => 3) 
    #=> #<MyClass:0x007f88240d66b0 @hash={:a=>1, :b=>2, :c=>3}> 
e1.hash 
    #=> {:a=>1, :b=>2, :c=>3} 

e2 = MyClass.new({ :a => 1, :b => 2, :c => 3 }) 
    #=> #<MyClass:0x007f882281d678 @hash={:c=>3, :b=>2, :a=>1}> 
e2.hash 
    #=> {:a=>1, :b=>2, :c=>3} 

e3 = MyClass.new(:b => 2, :a => 1, :c => 3) 
    #=> #<MyClass:0x007f88240bd408 @hash={:b=>2, :a=>1, :c=>3}> 
e3.hash 
    #=> {:b=>2, :a=>1, :c=>3} 

e1e2e3 「等效」?

e1 == e2 
    #=> false 
e1 == e3 
    #=> false 

e1.hash == e2.hash 
    #=> true 
e1.hash == e3.hash 
    #=> true 

看待這個另一種方法是如下:

class MyClass 
    attr_accessor :args 
    def initialize(*args) 
    @args = args 
    end 
end 

e1 = MyClass.new(:a => 1, :b => 2, :c => 3) 
    #=> #<MyClass:0x007f88240d66b0 @hash={:a=>1, :b=>2, :c=>3}> 
e1.args 
    #=> [{:a=>1, :b=>2, :c=>3}] 

這表明只有一個參數(散列)被傳遞給new

0

它可以是簡單:

require 'ostruct' 

class MyClass < OpenStruct 
end 

n = MyClass.new(:a => 1, :b => 2, :c => 3) 

n.a 
# => 1