2

私はこの件についてあまり知識がないので、ここで尋ねることにしました。Ruby(または他の参照スクリプト言語によるパス)にいくつかの「ライブラリ」があるとしましょう。

class Moo
    attr_accessor :bar
    def initialize
        self
    end
end

a = 'a string'
b = Moo.new
b.bar = a

b.bar明らかに。と同じオブジェクトになりますa

すべての場合にそのままにしておくのは正しいので、それらを別々に必要とするプログラマーは手動でクローンを作成しますか?それが私が思いついた唯一の正気のアイデアです。

4

1 に答える 1

2

最小の驚きの原則に従って、割り当てられたオブジェクトへの参照を維持することは正しいことです。

に割り当てられたオブジェクトを内部で行った場合、同じオブジェクトを参照したいライブラリの消費者にとって非常にイライラするでしょう。dupbar bar

> class Moo
>  attr_accessor :bar
> end
=> nil
> a = 'a string'
=> "a string"
> b = Moo.new
=> #<Moo:0x2bfd238>
> b.bar = a
=> "a string"
> a.upcase!
=> "A STRING"
> b.bar # should be uppercase as expected since `a` was modified *in-place*
=> "A STRING"
> b.bar = a.dup # now modifications to `a` will not affect `bar`
=> "A STRING"
> a.downcase!
=> "a string"
> b.bar
=> "A STRING"

補足としてdef initialize() self end、デフォルトと同じであるため、完全に不要ですinitialize

于 2010-05-20T16:24:37.947 に答える