Получите доступ к переменной экземпляра, используя ее имя (как символ) - PullRequest
6 голосов
/ 30 марта 2011

В Ruby у меня есть этот класс:

<code>
class Position
  attr_reader :x, :y
  def initialize(x, y)
      @x, @y = x, y
  end
end
Я хочу получить доступ к переменным x и y, используя символ, что-то вроде этого:
<code>axis = :x
pos = Position.new(5,6)
 #one way:
pos.axis # 5 (pos.x)
 #other way:
pos.get(axis) # 5 (pos.x)

Благодаря этому вопросу Я нашел с помощью этого кода, я могу добиться второго поведения.

<code>#...
class Position
  def get(var)
    instance_variable_get(("@#{var}").intern)
  end
end
Но это кажется уродливым и неэффективным (особенно преобразование символа в строку и обратно в символ). Есть ли лучший способ?

Ответы [ 2 ]

8 голосов
/ 30 марта 2011

Легко, используйте метод send

class Position
  attr_reader :x, :y

  def initialize(x, y)
    @x, @y = x, y
  end
end
 => nil 

pos = Position.new(5,5)
 => #<Position:0x0000010103d660 @x=5, @y=5> 

axis = :x
 => :x 

pos.send axis
 => 5 
2 голосов
/ 30 марта 2011

Вот способы сделать обе техники. Предполагая, что у нас уже есть определение вашего класса,

position = Position.new(1, 2)
axis = :x
position.send axis #=> 1
axis = :y
position.send axis #=> 2

Метод Object#send принимает как минимум символ, представляющий имя вызываемого метода, и вызывает его. Вы также можете передавать аргументы методу после имени и блока.

Второй способ сделать это (используя метод Position#get) -

class Position
  def get(axis)
    send axis
  end
end

position = Position.new(1, 2)
axis = :x
position.get axis #=> 1
axis = :y
position.get axis #=> 2

Я рекомендую этот способ, потому что он включает в себя метод получения значений. Если вам нужно изменить его позже, вам не нужно менять весь код, который использует Position.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...