имена методов ruby - PullRequest
       15

имена методов ruby

2 голосов
/ 08 сентября 2008

Для проекта, над которым я работаю в ruby, я переопределяю метод method_missing, чтобы я мог устанавливать переменные с помощью вызова метода, подобного этому, аналогично установке переменных в объекте ActiveRecord:

Object.variable_name= 'new value'

Однако после реализации этого я обнаружил, что во многих именах переменных есть точки (.). Я нашел этот обходной путь:

Object.send('variable.name=', 'new value')

Однако мне интересно, есть ли способ избежать периода, чтобы я мог использовать

Object.variable.name= 'new value'

Ответы [ 3 ]

9 голосов
/ 08 сентября 2008

Не делай этого!

Попытка создать идентификаторы, которые недопустимы на вашем языке, не является хорошей идеей. Если вы действительно хотите установить такие переменные, используйте макросы атрибутов:

attr_writer :bar
attr_reader :baz
attr_accessor :foo

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

class SillySetter
  def initialize path=nil
    @path = path
  end

  def method_missing name,value=nil
    new_path = @path ? "#{@path}.#{name}" : name
    if name.to_s[-1] == ?=
      puts "setting #{new_path} #{value}"
    else
      return self.class.new(path=new_path)
    end
  end
end

s = SillySetter.new
s.foo = 5              # -> setting foo= 5
s.foo.bar.baz = 4      # -> setting foo.bar.baz= 4

Я не хотел поощрять рубиновую глупость, но я просто не мог с собой поделать!

1 голос
/ 19 сентября 2008

Единственная причина, по которой я могу это сделать, это то, что вы действительно ДЕЙСТВИТЕЛЬНО ненавидите человека, который будет поддерживать этот код после вас.

И я не имею в виду ненависть «он наехал на мою собаку».

Я имею в виду настоящую парящую пульсирующую вену в храмовой ненависти.

Короче, не надо. : -)

0 голосов
/ 08 сентября 2008

Если нет надежды на изменение канонических имен, вы можете использовать псевдонимы для методов получения и установки вручную:

def variable_name
 send 'variable.name'
end

def variable_name=(value)
 send 'variable.name=', value
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...