1

私は「Beginning Ruby」という本に取り組んでいます。カプセル化に至るまで、すべてが順調に進んでいました。このコードが何をしているのかはわかりますが、メソッドでこのように設定されている理由がわかりません。

興味のある方は、この本のカプセル化に関するページへのリンクをご覧ください。

class Person
    def initialize(name)
        set_name(name)
    end

    def name
        @first_name + ' ' + @last_name
    end

    def set_name(name)
        first_name, last_name = name.split(/\s+/)
        set_first_name(first_name)
        set_last_name(last_name)
    end

    def set_first_name(name)
        @first_name = name
    end

    def set_last_name(name)
        @last_name = name
    end
end

p = Person.new("Fred Bloggs")
puts p.name

このようなものが同じことを達成できるように私には思えます:

class Person
    def initialize(name)
        @first_name, @last_name = name.split(/\s+/)
    end

    def name
        @first_name + ' ' + @last_name
    end
end

p = Person.new("Fred Bloggs")
puts p.name

個別のメソッドでオブジェクト変数を設定する手間がかかるのはなぜでしょうか?

4

4 に答える 4

1

ここで同様の説明を見つけることができます-Classes in Ruby Using Getters and Setters

p RUBY_VERSION

class Person
    def initialize(name)
        set_name(name)
    end

    def name
        @first_name + ' ' + @last_name
    end

    def set_name(name)
        first_name, last_name = name.split(/\s+/)
        set_first_name(first_name)
        set_last_name(last_name)
    end

    def set_first_name(name)
        @first_name = name
    end

    def set_last_name(name)
        @last_name = name
    end
end

John = Person.new("Fred Bloggs")
p John.name # now suppose you misrepresented the last name at time of `John` object creation. Then what would you do?

John.set_last_name "roy" # this setter method would then help you out to update the last name.

p John.name

説明:その人物のようなオブジェクトの作成時に人物名を設定した場合、作成時に間違った情報を入力した場合、それらを変更することはできません。コードの 2 番目の部分にセッターがないためです。

出力:

"2.0.0"
"Fred Bloggs"
"Fred roy"
于 2013-03-30T19:09:58.150 に答える
1

それらは、インスタンス変数のゲッターとセッターの非常に基本的なことをほとんど教えています。インスタンス変数に直接アクセスする必要があるコードを記述した方法で変数を変更したいとします。代わりに、これらの変数へのアクセスを許可するメソッドを作成して、インスタンス変数への完全なアクセスを与えずにクラスの外でそれらを使用できるようにします。

attr_accessorattr_reader、およびattr_writerインスタンス変数のアクセサーを動的に作成するマクロのようなものになると思います。

于 2013-03-30T19:16:52.293 に答える
1

ユーザー名のような名前があるとします。その場合、2つのメソッドだけを持つクラスは使用できませんが、元のクラスでは次のようなことをするだけです

Person.new("Stephan").set_last_name("de Vries")
于 2013-03-30T19:28:31.980 に答える
1

セッター メソッドは、既存のオブジェクトの状態を変更するのに役立ちます。あなたの場合、人の名前は「一種の」不変です。人の名前を変更することはできません。新しい名前で新しい人を作成することしかできません。

于 2013-03-30T19:08:11.053 に答える