クラス変数とクラスインスタンス変数とインスタンス変数の違いについて

Ruby Way 第2版を読んでいきなりつまづく。
P46

class Myclass
  @x = 1      # クラスインスタンス変数
  @y = 2      # 別のクラスインスタンス変数

  def mymethod
    @x = 3    # インスタンス変数
    # ここで@yにアクセスすることはできない
  end
end

これのなにが分からなかったかというと、クラスのはじめの@xとメソッド内の@xが別物であるということ(コメントに書いてあるんだけどね)。5年間C++を学んできた自分としては変数の宣言があることは当然だと思っていたため、なかなか理解できませんでした。
ということで、クラス変数とクラスインスタンス変数とインスタンス変数の違いについて。
クラス変数とは、

別名static変数とも言われ、各インスタンスが共有する変数のこと。

クラスインスタンス変数とは、

クラス変数とほぼ同じだが、そのクラスのみでしか参照できない変数のこと。例えば、そのクラスを継承したクラスではその変数にはアクセスできない。

インスタンス変数とは、

インスタンスごとに持つ変数のこと。

こんな感じ。

class MyClass
  @@class_var = "クラス変数"                     # クラス変数
  @class_instance_var = "クラスインスタンス変数"   # クラスインスタンス変数

  # クラス変数を取得
  def self.class_var
    @@class_var
  end
  
  # クラスインスタンス変数を取得
  def self.class_instance_var
    @class_instance_var
  end

  # インスタンス変数を取得
  def instance_var
    @instance_var = "インスタンス変数"       # インスタンス変数
  end
end

# 派生クラス
class Derived < MyClass; end


puts MyClass.class_var           # => クラス変数
puts MyClass.class_instance_var  # => クラスインスタンス変数
puts MyClass.new.instance_var    # => インスタンス変数

puts Derived.class_var           # => クラス変数
puts Derived.class_instance_var  # => nil

派生クラスでクラスインスタンス変数がnilになるところがミソ。これさえ分かれば問題ない。
参考:http://capsctrl.que.jp/kdmsnr/wiki/bliki/?ClassInstanceVariable

Ruby Way 第2版 (Professional Ruby Series)

Ruby Way 第2版 (Professional Ruby Series)