2016-08-19 5 views
-2

Rubyでバイナリ検索ツリーコードを書きました。私は今、なぜこのコードがのself.left = Node.new(3)に新しいノードを作る必要があるのだろうと思っています。Ruby BST:なぜこのコードは新しいノードを作るために「自己」を必要としますか?

left = Node.new(3)のように自分自身が削除できると思っていました。この場合、受信者は明らかです(insert_leftメソッドが適用されたインスタンス)。しかし、それは間違っているようです。私の考えが間違っている理由を助けてくれますか?

module BinaryTree 
class Node 
    attr_accessor :value, :left, :right 

def initialize(value) 
    @value = value 
end 

def insert(v) 
    case @value <=> v 
    when 1 then insert_left(v) 
    when -1 then insert_right(v) 
    when 0 then nil 
    end 
end 


private 
def insert_left(v) 
    if left 
    left.insert(v) 
    else 
    self.left = Node.new(v) 
    end 
end 

def insert_right(v) 
    if right 
    right.insert(v) 
    else 
    self.right = Node.new(v) 
    end 
end 

end 
end 

答えて

1

変数代入として解釈されますleft = xを呼び出します。 self.left = xを呼び出す方法は、のleft=のメソッド呼び出しです。これらは明らかに2つの異なるものですが、あなたが表記に慣れていない限り、これは意味をなさないかもしれません。特に直感的ではなく、特にx = leftがうまく動作し、leftが変数またはメソッド呼び出しであることを明示する必要がなく、初心者の方が困惑しています。

ローカル変数(Perl、PHPなど)に接頭辞が付いている言語とは異なり、Rubyにはそのような識別子はありません。したがって、lvalue = exprという形式のものを変数代入と解釈し、object.property = expoをミューテータメソッドのメソッド呼び出しと解釈します。

Rubyはインスタンス@x = expr@@y = exprなどのクラスレベルの変数を識別しないが、それは全く別のことです。

+0

ありがとう、私は変数の代入を呼び出しメソッドと混同しました。 – Ezerk

関連する問題