Rubyの取得メソッドと設定



目次
  • What is a getter method
  • What is a setter method
  • What are accessors?
  • References

  • ゲッター法とは
    Getterメソッドはインスタンス変数の値を取得するメソッドです.
    Getterメソッドを使用せずに、インスタンス変数をインスタンス化したクラスの外部インスタンスインスタンスの値を取得できません.
    以下が例です.
    class Movie
      def initialize(name)
        @name = name
      end
    end
    
    obj1 = Movie.new('Forrest Gump')
    p obj1.name #=> undefined method `name' for #<Movie:0x007fecd08cb288 @name="Forrest Gump"> (NoMethodError)
    
    ご覧の通り、価値はobj1 ( name ) 外部から取得できませんMovie クラス.クラスの外部でインスタンス変数の値を取得する場合、No Mothod Error .
    では、値の取得方法を見てみましょうobj1Movie ゲッターメソッドを持つクラス.
    あなたがここでしなければならないすべてはgetter method 名前name . ゲッターメソッドの名前は何でも構いませんが、インスタンス変数の名前のゲッターメソッドを指定するのは一般的です.
     class Movie
      def initialize(name)
        @name = name
      end
    
      def name
        @name
      end
    end
    
    obj1 = Movie.new('Forrest Gump')
    p obj1.name #=> "Forrest Gump"
    

    セッターとは何か
    セッターはインスタンス変数の値を設定するメソッドです.
    Setterメソッドを使用せずに、クラスの外部のインスタンス変数に値を割り当てることはできません.
    クラス外でインスタンス変数の値を設定しようとすると、Ruby RiseNo Method Error クラスの外部インスタンスインスタンス変数の値を取得する場合は、getterメソッドを使用しないでください.
    class Movie
      def initialize(name)
        @name = name
      end
    
      def name #getter method
        @name
      end
    end
    
    obj1 = Movie.new('Forrest Gump')
    p obj1.name #=> "Forrest Gump"
    obj1.name = 'Fight Club' #=> undefined method `name=' for #<Movie:0x007f9937053368 @name="Forrest Gump"> (NoMethodError)
    
    クラス内で設定メソッドを定義することで、クラス外のインスタンス変数の値を設定できます.
    次のコードのような設定メソッドを定義できます.
     class Movie
      def initialize(name)
        @name = name
      end
    
      def name #getter method
        @name
      end
    
      def name=(name) #setter method
        @name = name
      end
    end
    
    obj1 = Movie.new('Forrest Gump')
    p obj1.name #=> "Forrest Gump"
    obj1.name = 'Fight Club'
    p obj1.name #=> "Fight Club"
    
    使用によってname= , これで新しい値を割り当てることができますFight Club to obj1 .

    アクセサーとはAccessors クラス内で明示的に定義せずに、取得メソッドと設定メソッドを作成する方法です.
    Rubyではアクセサの3種類があります.
  • attr_reader 与えられた属性に対して自動的にゲッターメソッドを生成します.
  • attr_writer 自動的に指定された属性の設定メソッドを生成します.
  • attr_accessor 与えられた属性に対する取得メソッドと設定メソッドを自動的に生成します.
  • まず、見てみましょうattr_reader !
    下記のコードでご覧ください.name and year 外部から取得するMovie どちらのクラスにもゲッターメソッドはありません.これはattr_reader 与えられた属性に対するgetterメソッドを生成します.
    class Movie
      attr_reader :name, :year
    
      def initialize(name, year)
        @name = name
        @year = year
      end
    end
    obj1 = Movie.new('Forrest Gump', 1994)
    p obj1.name #=> Forrest Gump
    p obj1.year #=> 1994
    
    第二に、どのように見てみましょうattr_writer 作品!
    上に述べたように.attr_witer 指定した属性の設定メソッドを生成します.したがって、新しい値を割り当てることができますob1 Setterメソッドを明示的に記述せずにname and year !
    class Movie
      attr_reader :name, :year 
      attr_writer :name, :year
    
      def initialize(name, year)
        @name = name
        @year = year
      end
    end
    obj1 = Movie.new('Forrest Gump', 1994)
    obj1.name = 'Fight Club'
    obj1.year = 1999
    p obj1.name #=> "Fight Club"
    p obj1.year #=> 1999
    
    確かに少なくとも最後に.attr_accessor 何をするかattr_reader and attr_writer コードの1行だけで行う!指定された属性に対して自動的にgetterとsetter mehodを生成します.
    class Movie
      attr_accessor :name, :year
    
      def initialize(name, year)
        @name = name
        @year = year
      end
    end
    obj1 = Movie.new('Forrest Gump', 1994)
    obj1.name = 'Fight Club'
    obj1.year = 1999
    p obj1.name #=> "Fight Club"
    p obj1.year #=> 1999
    

    参考文献
    Ruby Getters and Setters
    How getter/setter methods work in Ruby
    What is attr_accessor in Ruby?
    rubylearning.com