Rubyのattr_accessorとは何ですか?


1024

私は理解しにくい時間が午前attr_accessor中にルビーを
誰かがこれを私に説明できますか?



1
attr_accessorはGitでも同じように機能しますか?一部のチュートリアルでは説明が不十分であり、他のチュートリアルは事前の知識があると思います。
Angelfirenze 2014

10
@Angelfirenze、とgitは何の関係もありませんattr_accessor。Gitは一方、バージョン管理ソフトウェアでattr_accessorあるRubyで方法
ウズベクジョン

回答:


2360

クラスがあるとしましょうPerson

class Person
end

person = Person.new
person.name # => no method error

明らかにメソッドを定義したことはありませんname。そうしよう。

class Person
  def name
    @name # simply returning an instance variable @name
  end
end

person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error

名前は読み取れますが、名前を割り当てることができるわけではありません。これらは2つの異なる方法です。前者はリーダーと呼ばれ、後者はライターと呼ばれます。まだライターを作成していないので、作ってみましょう。

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"

驚くばかり。これで、@nameリーダーメソッドとライターメソッドを使用してインスタンス変数を読み書きできるようになりました。これが頻繁に行われることを除いて、なぜこれらのメソッドを毎回書くのに時間を浪費するのでしょうか?もっと簡単にできます。

class Person
  attr_reader :name
  attr_writer :name
end

これでも繰り返し発生する可能性があります。リーダーとライターの両方が必要な場合は、アクセサーを使用してください。

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Dennis"
person.name # => "Dennis"

同じように機能します!そして、何を推測するか@nameを考えます。personオブジェクトのインスタンス変数は、手動で設定した場合と同じように設定されるため、他のメソッドで使用できます。

class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

それでおしまい。、、およびメソッドが実際にメソッドを生成する方法を理解するにattr_readerattr_writerattr_accessor他の回答、書籍、Rubyドキュメントをお読みください。


46
@hakunin-その明確な答えをありがとう。Ruby構文がattr_ *ステートメントのインスタンス変数にコロン「:」を提案するのはなぜですか?変数を参照するためにクラスの他の場所で使用されているものと同じ '@'構文を使用する方が簡単なようです。
ウィル

207
@WilliamSmith質問に答えるにattr_accessorは、それが現在のクラスで呼び出されるメソッドであり、:nameそのメソッドに渡すパラメーターであることを理解する必要があります。これは特別な構文ではなく、単純なメソッド呼び出しです。@name変数を指定する場合、@ nameにはが含まれるため、意味がありませんnil。だから、書くようなものattr_accessor nilです。作成する必要がある変数を渡さず、変数を呼び出す名前を渡します。
Max Chernyak

23
@hakunin-それは完全に理にかなっています。今日私は、rubyがファイルを解析するときに実際に「実行」されていること、およびすべてのステートメントと式が実際にはオブジェクトのメソッド呼び出しであることを知っています。attr_accessorを含みます。非常に役立ちます。
ウィル

52
Railsを3年間使用しました。恥
ショーン・シャオ

5
@Bumindaはい、しかしメソッドnameと変数@nameは同じものではありません。それらを混同しないでください。@nameクラスにインスタンス変数があり、attr_reader :nameそれを外部から読み取れるように定義します。なしattr_readerあなたがアクセスできる簡単な方法はありません@name、あなたのクラスの外には。
Max Chernyak 2013

127

attr_accessor単なるメソッドです。(リンクはそれがどのように機能するかについてより多くの洞察を提供するはずです-生成されたメソッドのペアを見てください、そしてチュートリアルはそれを使用する方法をあなたに示すはずです。)

コツは、Rubyでの定義classなく(C ++やJavaなどの言語では「単なる定義」です)、評価される式ですattr_accessor現在のクラスを変更するメソッドが呼び出されるのは、この評価中です-暗黙のレシーバーを覚えておいてくださいself.attr_accessorselfこの時点で「オープン」クラスのオブジェクトです。

attr_accessorと友人の必要性は、まあ、です:

  1. Smalltalkと同様に、Rubyでは、そのオブジェクトのメソッド1の外部でインスタンス変数にアクセスできません。つまり、インスタンス変数x.yには、JavaやPythonのように一般的な形式ではアクセスできません。Ruby yでは常に送信するメッセージ(または「呼び出す方法」)として解釈されます。したがって、attr_*メソッドは、@variable動的に作成されたメソッドを介してインスタンスアクセスをプロキシするラッパーを作成します。

  2. ボイラープレートは吸う

これで細かい詳細の一部が明確になることを願っています。ハッピーコーディング。


1これは厳密には当てはまりません。また、この周りにいくつかの「テクニック」がありますが、「パブリックインスタンス変数」アクセスの構文サポートはありません。


attr_accessorが「単なるメソッド」であると言うと、それがわかります。しかし、そのメソッドを呼び出すために使用される構文は何ですか?some_method:name => "whatever"、:notherName、:etcなどの構文について説明しているrubyドキュメントのセクションを見つけるのに問題があります
BT

68

attr_accessor(@pstが述べたように)単なるメソッドです。それが行うことはあなたのためにより多くのメソッドを作成することです。

したがって、このコードは次のとおりです。

class Foo
  attr_accessor :bar
end

このコードと同等です:

class Foo
  def bar
    @bar
  end
  def bar=( new_value )
    @bar = new_value
  end
end

Rubyでこの種のメソッドを自分で書くことができます:

class Module
  def var( method_name )
    inst_variable_name = "@#{method_name}".to_sym
    define_method method_name do
      instance_variable_get inst_variable_name
    end
    define_method "#{method_name}=" do |new_value|
      instance_variable_set inst_variable_name, new_value
    end
  end
end

class Foo
  var :bar
end

f = Foo.new
p f.bar     #=> nil
f.bar = 42
p f.bar     #=> 42

3
これは、最も初心者レベルのシナリオでもメタプログラミングが使用される好例です。非常に素晴らしい。
John Simon、

2
の実装スケッチを探していて、attr_accessorようやくここに見つかりました!私の問題は解決しましたが、このような実装例がどこにあるのか知りたいのですが(book / official doc)?
Wasif Hossain

40

attr_accessor 非常に簡単です:

attr_accessor :foo

のショートカットです:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

オブジェクトのゲッター/セッターに過ぎない


10
あなたの答えは結構です。私の辞書によると、「ショートカット」は「短い代替ルート」を意味し、「構文糖」や「インタプリタによって解釈されるマクロ」ではありません。
bowsersenior

25

基本的に、Rubyにはない、一般にアクセス可能なデータ属性を偽造します。


4
このコメントは完全には役に立ちませんが、事実です。Rubyの「get」メソッドの外には公開データ属性が存在しないという事実を強調します。これは、言語を学ぼうとしている人にとって非常に役立つ情報です。
Eric Dand 2013年

3
これは実際に反対投票すべきではありません。Ruby以外の人がこれを理解しようとするとき、この回答は非常に役立ちます。
ブラッド

1
同意しました。C#の名前と非常によく似ています{get; セット;}
デビッドミラー

17

これは、インスタンス変数のゲッターメソッドとセッターメソッドを定義するメソッドにすぎません。実装例は次のとおりです。

def self.attr_accessor(*names)
  names.each do |name|
    define_method(name) {instance_variable_get("@#{name}")} # This is the getter
    define_method("#{name}=") {|arg| instance_variable_set("@#{name}", arg)} # This is the setter
  end
end

この方法で複数の属性を処理することは素晴らしいです!
Wasif Hossain

これは、メタプログラミングに関連した別の質問を解決するのに非常に役立つコードスニペットでした。
alexventuraio

15

コードなしの簡単な説明

上記の回答のほとんどはコードを使用しています。この説明は、アナロジー/ストーリーを介して、何も使わずに答えようとします:

外部の当事者は内部のCIAシークレットにアクセスできません

  • 本当に秘密の場所、CIAを想像してみましょう。CIA内部の人々を除いて、CIAで何が起こっているのか誰も知りません。つまり、外部の人々はCIAの情報にアクセスできません。しかし、完全に秘密にされた組織を持つのは良くないので、特定の情報が外部の世界に公開されます-もちろんCIAが皆に知ってもらいたいことだけです:例えばCIAのディレクター、この部門がどのように環境に優しいかその他の情報:たとえば、イラクやアフガニスタンでその秘密工作員は誰か-これらの種類のことは、おそらく今後150年間は秘密のままです。

  • CIAの外にいる場合は、CIAが公開した情報にのみアクセスできます。または、CIA用語を使用するには、「クリア」された情報にのみアクセスできます。

  • CIAがCIAの外部の一般の人々に提供したい情報は、属性と呼ばれます。

読み取りおよび書き込み属性の意味:

  • CIAの場合、ほとんどの属性は「読み取り専用」です。これは、CIAの外部のパーティーの場合、「CIAのディレクターは誰ですか?」と尋ねることができることを意味します。正解が得られます。しかし、「読み取り専用」属性ではできないのは、CIAに変更を加えることです。たとえば、電話をかけることができず、キムカーダシアンをディレクターにしたい、またはパリスヒルトンを最高司令官にしたいと突然決めたとします。

  • 属性によって「書き込み」アクセス権が付与されている場合は、外にいても必要に応じて変更を加えることができます。そうでなければ、あなたができる唯一のことは読むことです。

    言い換えると、アクセサは、アクセサが読み取りアクセサであるか書き込みアクセサであるかに応じて、外部の人を許可しない組織に問い合わせを行ったり、変更を加えたりすることができます。

クラス内のオブジェクトは互いに簡単にアクセスできます

  • 一方、すでにCIA 内にいる場合は、カブールでCIAの工作員を簡単に呼び出すことができます。これは、すでに内部にいる場合、この情報に簡単にアクセスできるためです。ただし、CIAの外にいる場合は、アクセス権が与えられないだけです。彼らが誰であるか(読み取りアクセス)を知ることができず、彼らの使命を変更すること(書き込みアクセス)もできません。

クラスについてもまったく同じであり、クラス内の変数、プロパティ、メソッドにアクセスする機能も備えています。HTH!ご不明な点がございましたら、お気軽にお問い合わせください。


あなたの説明は理にかなっています!+1申し訳ありませんが、「CIAによってクリアされた情報は正しいですか?
kouty

CIAにはさまざまな「クリアランス」レベルがあります。たとえば、トップシークレット(Prez以外の誰も)やパブリックトラスト(誰でもその情報を読むことができます)。CIAは実際に多くの非常にすばらしい事実を提供します!
BKSpurgeon 2016

あなたはカーダシアン、パリスヒルトンの例にだけ賛成票を投じる価値があります:)トランプ大統領にとってはそれで十分だと思いました。
rmcsharry

はい!それが私たちが必要としていること、コードなしのStackOverflow!:-)
マービン、

13

OOPの概念に精通している場合は、ゲッターメソッドとセッターメソッドに精通している必要があります。attr_accessorはRubyでも同じことをします。

一般的な方法でのゲッターとセッター

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Eshaan'
person.name # => "Eshaan"

セッターメソッド

def name=(val)
  @name = val
end

ゲッター法

def name
  @name
end

Rubyのゲッターおよびセッターメソッド

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Eshaan"
person.name # => "Eshaan"

2
完璧な説明!これは非常に便利な動作で、非常に簡単にオーバーライドできます。
ルビーライダー、2015

12

私もこの問題に直面し、この質問に対してやや長い回答を書きました。これにはすでにいくつかの素晴らしい答えがありますが、より明確にすることを探している人は誰でも、私の答えが役に立てば幸いです

メソッドの初期化

Initializeを使用すると、クラスの新しいインスタンスを作成するたびにコード内の別の行にデータを設定する必要がなく、インスタンスの作成時にオブジェクトのインスタンスにデータを設定できます。

class Person

  def initialize(name)
    @name = name
  end


  def greeting
    "Hello #{@name}"
  end
end

person = Person.new("Denis")
puts person.greeting

上記のコードでは、InitializeのパラメーターにDennisを渡すことで、initializeメソッドを使用して名前「Denis」を設定しています。initializeメソッドなしで名前を設定したい場合は、次のように設定できます。

class Person
  attr_accessor :name

  # def initialize(name)
  #     @name = name
  # end

  def greeting
    "Hello #{name}"
  end
end

person = Person.new
person.name = "Dennis"
puts person.greeting

上記のコードでは、オブジェクトの初期化時に値を設定するのではなく、person.nameを使用してattr_accessorセッターメソッドを呼び出すことで名前を設定しています。

この作業を行う両方の「方法」ですが、初期化により時間とコードの行を節約できます。

これが初期化の唯一の仕事です。メソッドとして初期化を呼び出すことはできません。インスタンスオブジェクトの値を実際に取得するには、ゲッターとセッター(attr_reader(get)、attr_writer(set)、attr_accessor(both))を使用する必要があります。これらの詳細については、以下を参照してください。

ゲッター、セッター(attr_reader、attr_writer、attr_accessor)

ゲッター、attr_reader:ゲッターの目的は、特定のインスタンス変数の値を返すことです。内訳については、以下のサンプルコードをご覧ください。

class Item

  def initialize(item_name, quantity)
    @item_name = item_name
    @quantity = quantity
  end

  def item_name
    @item_name
  end

  def quantity
     @quantity
  end
end

example = Item.new("TV",2)
puts example.item_name
puts example.quantity

上記のコードでは、アイテム「example」のインスタンスでメソッド「item_name」と「quantity」を呼び出しています。「puts example.item_name」と「example.quantity」は、「example」に渡されたパラメーターの値を返し(または「get」)、それらを画面に表示します。

幸いにも、Rubyには、このコードをより簡潔に記述できる固有のメソッドがあります。attr_readerメソッド。以下のコードを参照してください。

class Item

attr_reader :item_name, :quantity

  def initialize(item_name, quantity)
    @item_name = item_name
    @quantity = quantity
  end

end

item = Item.new("TV",2)
puts item.item_name
puts item.quantity

この構文はまったく同じように機能しますが、6行のコードが節約されるだけです。Itemクラスに起因する5つの州があるとしたらどうでしょうか。コードはすぐに長くなります。

セッター、attr_writer:最初にセッターメソッドと私を交差させたのは、私の目では、initializeメソッドと同じ機能を実行しているように見えたということです。以下、私の理解に基づいて違いを説明します。

前述のように、initializeメソッドを使用すると、オブジェクトの作成時にオブジェクトのインスタンスの値を設定できます。

しかし、インスタンスの作成後に後で値を設定する場合、または初期化後に値を変更する場合はどうでしょうか。これは、setterメソッドを使用するシナリオです。それが違いです。最初にattr_writerメソッドを使用しているときに、特定の状態を「設定」する必要はありません。

以下のコードは、setterメソッドを使用して、Itemクラスのこのインスタンスの値item_nameを宣言する例です。自分でコードをテストする場合に備えて、値を取得して画面に出力できるように、引き続きゲッターメソッドattr_readerを使用していることに注意してください。

class Item

attr_reader :item_name

  def item_name=(str)
    @item_name = (str)
  end

end

以下のコードは、attr_writerを使用してもう一度コードを短くし、時間を節約する例です。

class Item

attr_reader :item_name
attr_writer :item_name

end

item = Item.new
puts item.item_name = "TV"

以下のコードは、作成時にitem_nameのオブジェクト値を設定するために初期化を使用している上記の初期化の例の繰り返しです。

class Item

attr_reader :item_name

  def initialize(item_name)
    @item_name = item_name
  end

end

item = Item.new("TV")
puts item.item_name

attr_accessor:attr_readerとattr_writerの両方の機能を実行し、コードを1行節約します。


10

新しいRubyists /プログラマー(私のように)を混乱させるものの一部は次のとおりです:

「インスタンスに特定の属性(名前など)があることを伝えて、その属性に値をすべて一度に与えることができないのはなぜですか?」

もう少し一般化されていますが、これが私にとってクリックした方法です:

与えられた:

class Person
end

Person を名前を持つことができるものとして定義していませんやその他の属性を。

したがって、次の場合:

baby = Person.new

...そして、名前を付けようとします...

baby.name = "Ruth"

私たちは、取得エラー Rubylandで、対象のPersonクラスが関連付けられてか、「名前」を有することのできるものではありません、ので...まだ!

しかし、「Personクラス(baby)のインスタンスは、次のことができるようになりました。 'name'と呼ばれる属性を持つので、構文を取得する方法だけでなく、その名前を設定しますが、そうすることは理にかなっています。」

繰り返しますが、この質問を少し異なる、より一般的な角度から当てることはできますが、これが、このスレッドへの道を見つけるPersonクラスの次のインスタンスに役立つことを願っています。


7

簡単に言うと、クラスのセッターとゲッターを定義します。

ご了承ください

attr_reader :v is equivalant to 
def v
  @v
end

attr_writer :v is equivalant to
def v=(value)
  @v=value
end

そう

attr_accessor :v which means 
attr_reader :v; attr_writer :v 

クラスのセッターとゲッターを定義するのと同じです。


5

指定された属性のおよびメソッドをattr-accessor作成するだけですgettersetter


5

それを理解する別の方法は、 attr_accessor

例:

class BankAccount    
  def initialize( account_owner )
    @owner = account_owner
    @balance = 0
  end

  def deposit( amount )
    @balance = @balance + amount
  end

  def withdraw( amount )
    @balance = @balance - amount
  end
end

次のメソッドを使用できます。

$ bankie = BankAccout.new("Iggy")
$ bankie 
$ bankie.deposit(100)
$ bankie.withdraw(5)

次のメソッドはエラーをスローします。

$ bankie.owner     #undefined method `owner'... 
$ bankie.balance   #undefined method `balance'...

ownerそしてbalance、技術的に、ではない方法ではなく、属性。BankAccountクラスにはdef ownerand はありませんdef balance。その場合は、以下の2つのコマンドを使用できます。しかし、これらの2つの方法はありません。しかし、あなたがすることができますアクセスし、あなたがしたいかのように属性をアクセスを経由する方法をattr_accessorしたがって、単語attr_accessor。属性。アクセサ。メソッドにアクセスするのと同じように属性にアクセスします。

追加attr_accessor :balance, :ownerするbalanceと、owner「メソッド」を読み書きできます。これで、最後の2つの方法を使用できます。

$ bankie.balance
$ bankie.owner

2

このモジュールの名前付き属性を定義します。名前はsymbol.id2nameで、インスタンス変数(@name)とそれに対応するアクセスメソッドを作成して読み取ります。また、name =というメソッドを作成して属性を設定します。

module Mod
  attr_accessor(:one, :two)
end
Mod.instance_methods.sort   #=> [:one, :one=, :two, :two=]

1

属性アクセサー、つまりattr_accessorを要約すると、2つの無料のメソッドが提供されます。

Javaのように、それらはゲッターとセッターと呼ばれます。

多くの回答が良い例を示しているので、簡単に説明します。

#the_attribute

そして

#the_attribute =

古いRubyドキュメントでは、ハッシュタグはメソッドを意味します。クラス名のプレフィックスを含めることもできます... MyClass#my_method


1

私はルビーは初めてで、次の奇妙さを理解するだけで対処する必要がありました。将来、誰かを助けるかもしれません。最後に、上記のとおり、2つの関数(def myvar、def myvar =)は両方とも暗黙的に@myvarにアクセスしますが、これらのメソッドはローカル宣言でオーバーライドできます。

class Foo
  attr_accessor 'myvar'
  def initialize
    @myvar = "A"
    myvar = "B"
    puts @myvar # A
    puts myvar # B - myvar declared above overrides myvar method
  end

  def test
    puts @myvar # A
    puts myvar # A - coming from myvar accessor

    myvar = "C" # local myvar overrides accessor
    puts @myvar # A
    puts myvar # C

    send "myvar=", "E" # not running "myvar =", but instead calls setter for @myvar
    puts @myvar # E
    puts myvar # C
  end
end

0

属性とアクセサーメソッド

属性は、オブジェクトの外部からアクセスできるクラスコンポーネントです。これらは、他の多くのプログラミング言語ではプロパティとして知られています。それらの値には、object_name.attribute_nameのように、「ドット表記」を使用してアクセスできます。Pythonや他のいくつかの言語とは異なり、Rubyではインスタンス変数にオブジェクトの外部から直接アクセスできません。

class Car
  def initialize
    @wheels = 4  # This is an instance variable
  end
end

c = Car.new
c.wheels     # Output: NoMethodError: undefined method `wheels' for #<Car:0x00000000d43500>

上記の例では、cはCarクラスのインスタンス(オブジェクト)です。オブジェクトの外部からwheelインスタンス変数の値を読み取ろうとして失敗しました。Rubyがcオブジェクト内でwheelという名前のメソッドを呼び出そうとしましたが、そのようなメソッドが定義されていませんでした。つまり、object_name.attribute_nameは、オブジェクト内のattribute_nameという名前のメソッドを呼び出そうとします。外部からwheel変数の値にアクセスするには、その名前でインスタンスメソッドを実装する必要があります。これにより、呼び出されたときにその変数の値が返されます。これは、アクセサメソッドと呼ばれます。一般的なプログラミングコンテキストでは、オブジェクトの外部からインスタンス変数にアクセスする通常の方法は、ゲッターメソッドおよびセッターメソッドとも呼ばれるアクセサーメソッドを実装することです。

次の例では、オブジェクトの外部からwheel変数にアクセスするために、ゲッターメソッドとセッターメソッドをCarクラスに追加しています。これは、ゲッターとセッターを定義する「Rubyの方法」ではありません。これは、getterメソッドとsetterメソッドの機能を説明するためだけのものです。

class Car
  def wheels  # getter method
    @wheels
  end

  def wheels=(val)  # setter method
    @wheels = val
  end
end

f = Car.new
f.wheels = 4  # The setter method was invoked
f.wheels  # The getter method was invoked
# Output: => 4

上記の例は機能し、同様のコードが他の言語でゲッターおよびセッターメソッドを作成するために一般的に使用されます。ただし、Rubyはこれを行うためのより簡単な方法を提供します。attr_reader、attr_writer、attr_acessorと呼ばれる3つの組み込みメソッドです。attr_readerメソッドはインスタンス変数を外部から読み取り可能にし、attr_writerはインスタンス変数を書き込み可能にし、attr_acessorはインスタンス変数を読み取りおよび書き込み可能にします。

上記の例はこのように書き直すことができます。

class Car
  attr_accessor :wheels
end

f = Car.new
f.wheels = 4
f.wheels  # Output: => 4

上記の例では、wheels属性はオブジェクトの外部から読み取りおよび書き込み可能です。attr_accessorの代わりにattr_readerを使用した場合、読み取り専用になります。attr_writerを使用した場合、書き込み専用になります。これらの3つのメソッドは、それ自体はゲッターおよびセッターではありませんが、呼び出されると、ゲッターおよびセッターメソッドを作成します。これらは、動的に(プログラムで)他のメソッドを生成するメソッドです。それはメタプログラミングと呼ばれています。

Rubyの組み込みメソッドを使用しない最初の(より長い)例は、getterメソッドとsetterメソッドで追加のコードが必要な場合にのみ使用してください。たとえば、セッターメソッドは、インスタンス変数に値を割り当てる前に、データを検証するか、何らかの計算を行う必要がある場合があります。

instance_variable_getおよびinstance_variable_set組み込みメソッドを使用して、オブジェクトの外部からインスタンス変数にアクセス(読み取りおよび書き込み)することができます。ただし、カプセル化をバイパスするとあらゆる種類の混乱を招く傾向があるため、これはめったに正当化できず、通常は悪い考えです。


-2

うーん。良い答えがたくさん。ここに私の数セントです。

  • attr_accessor繰り返しの方法をクリーンアップ(乾燥)するのに役立つ簡単な方法です。getter and setter

  • そのため、セッターやゲッターについて心配することなく、ビジネスロジックの記述にさらに集中できます。


-3

他のファイルに対するattr_accessorの主な機能は、他のファイルのデータにアクセスする機能です。
したがって、通常はattr_readerまたはattr_writerがありますが、良いニュースは、Rubyではこれら2つをattr_accessorと組み合わせることができるということです。丸みを帯びているか、用途が広いのでこれを自分の行く方法と考えています。また、Railsではバックエンドで実行するため、これが排除されていることを覚えておいてください。つまり、言い換えると、特定のことを心配する必要がないので、他の2つよりもattr_acessorを使用する方がベターです。アクセサがすべてをカバーします。これはより一般的な説明ですが、初心者には役立ちました。

これが役に立てば幸い!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.