Моя идея - создать вики сообщества для людей, которые приходят с фона java, потому что, читая много объяснений, я ничего не мог понять, пока я не попробовал пару вещей, и части головоломки начали найти свои места. Но сначала я должен убедиться, что все правильно. Исходя из этого, мне было очень сложно понять, что @variable может означать две разные вещи.
Вот пример:
class Test
  @ins = "gah"
  def self.ins
    puts @ins
  end
  def initialize()
    @ins = "wtf?"
  end
  def ins2
    puts @ins
  end
end
Насколько я понимаю, первая @ins - это переменная экземпляра объекта, представляющего класс Test. Второй @ins является переменной экземпляра в объекте класса Test.
Теперь все начинает иметь для меня какой-то смысл. Вот несколько примеров:
[14] pry(main)> test.ins2
wtf?
Мы вызываем метод объекта и возвращаем переменную экземпляра объекта.
[15] pry(main)> test.ins
NoMethodError: undefined method `ins' for #<Test:0x000000017d9348 @ins="wtf?">
Мы пытаемся вызвать метод класса через объект, этот метод относится к классу, поэтому мы получаем NoMethodError
[16] pry(main)> Test.ins
gah
Мы вызываем метод класса, поэтому он правильно видит переменную экземпляра объекта класса.
[17] pry(main)> Test.ins2
NoMethodError: undefined method `ins2' for Test:Class
Мы вызываем объектный метод через класс, который является неправильным, поэтому бросаем NoMethodError.
Все вышесказанное было выполнено с рубином 2.0. Так что я спрашиваю?
- Я правильно понял?
 - Я получаю правильную терминологию Ruby?
 - Любое реальное использование переменных экземпляра класса, которое имеет смысл в правильно спроектированном приложении? Или это просто лучшие переменные класса @@?