19171


[ActiveSupport::Concern と、Module#concerning](http://qiita.com/kasei-
san/items/c016c626836da09a5a70)  
↑こちらの記事から引用しています。

[code]

    module Human
      extend ActiveSupport::Concern
    
      included do
        attr_accessor :name
        def self.default_name
          "太郎"
        end
    
        def default_name?
          name == self.class.default_name
        end
      end
    end
    
[/code]

この中の`self.class.default_name`という記述がありますが、`self.default_name`というように`class`を省略することはそもそもできないのでしょうか。  
できた場合、挙動の違いなどありましたら教えていただけると幸いです。


CC BY-SA 3.0
2015-11-22T10:12:17.713
19167
2015-11-22T22:37:36.237
2015-11-22T22:37:36.237
5519
9149
question
ruby-on-rails ruby
Rubyで書かれたこのコードについて教えて下さい


`default_name` はインスタンスメソッドではなく、クラスメソッドである事を理解下さい。  
つまり参照する方法は

[code]

    m = Member.new
    p m.default_name
    
[/code]

ではなく

[code]

    p Member.default_name
    
[/code]

です。これは `default_name` がインスタンス毎に変わる値ではなく、`Member` の普遍的な値にしたいからです。かたや
`default_name?` はインスタンスメソッドです。`name` の値を更新する度に戻り値が変わりうる物です。

[code]

    def default_name?
        ...
    end
    
[/code]

ここで比較したい値は、インスタンスのメンバ属性 `name` と、先ほどの普遍的な値 `default_name` なので

[code]

    def default_name?
      name == Member.default_name
    end
    
[/code]

こう書く事が出来ます。ですが出来れば汎用的に書きたいですよね。結果として

[code]

    def default_name?
      name == self.class.default_name
    end
    
[/code]

こう書く事になります。


CC BY-SA 3.0
2015-11-22T14:29:02.453
19171
2015-11-22T14:29:02.453
440
19167
answer