Эквивалентный рубиновый код для следования без attr_accessor? - PullRequest
0 голосов
/ 28 июля 2011

Это код Java:

public class test{
     public static void main(String args[]){
     number A = new number();
     System.out.println(A.b);       
    }   
}

class number{
    int b = 100;    
}

Есть ли эквивалент кода выше в ruby ​​без attr_accessor?

Почему мы не можем получить доступ к переменным-членам, используя '.'как в яве?или есть способ, о котором я не знаю в рубине ...?

Ответы [ 3 ]

5 голосов
/ 28 июля 2011

Переменные экземпляра по умолчанию скрыты. Вы можете обойти это, используя instance_variable_get и instance_variable_set, но они являются частными (вы также можете обойти это, если нужно), потому что делать такие вещи однотипно.

В Ruby, когда вы говорите foo.bar, вы вызываете метод bar для вашего объекта foo (без аргументов). Когда вы говорите foo.bar = 5, вы вызываете метод bar= с аргументом 5.

Все, что attr_accessor делает, это предоставляет вам реализации bar и bar=, но это:

class MyClass
  attr_accessor :bar
end

эквивалентно

class MyClass
  def bar
    @bar
  end

  def bar=(new_bar)
    @bar = new_bar
  end
end

Это позволит вам позже заменить реализацию чем-то другим, если хотите. Предполагается, что переменные экземпляра являются частными для этого объекта, поэтому я бы не советовал пытаться обойти это, если вы не выполняете метапрограммирование в тяжелых условиях.

3 голосов
/ 28 июля 2011

Если вы просто хотите передать структурированные данные, то вы можете использовать класс Ruby Struct, который будет работать больше, чем вы ожидаете из своего примера:

Number = Struct.new(:value)
n = Number.new
n.value = 123
n.value # => 123
1 голос
/ 28 июля 2011

Эквивалент равен с использованием Ruby's attr_accessor. Почему вы хотите избежать этого?

class number
  attr_accessor :b
end

Тогда вы можете позвонить

a = number.new
a.b = 1
...