Почему я не могу использовать attr_accessor внутри инициализации?

Долгий ответ заключается в том, что вы можете делать все, что поддерживает терминал. Существует много видов терминалов (или «устройств вывода символов»), многие из которых поддерживают движения курсора. (Вы можете увидеть проект Termcap Library , чтобы создать представление о том, что делают разные типы терминалов.) Существует команда терминала для перемещения по линии, поэтому, в общем, да, вы должны это сделать. После того, как я запустил базу данных termcap , я пришел к следующему:

$ printf "\n"; printf '\e[A'; echo Foo
Foo

Другими словами, строка \e[A имеет ненулевой шанс получить вас расстановка. На некоторых терминалах:)

13
задан Geo 14 November 2009 в 17:43
поделиться

1 ответ

Вы не можете вызвать attr_accessor в экземпляре, потому что attr_accessor не определен как метод экземпляра MyClass. Это доступно только для модулей и классов. Я подозреваю, что вы хотите вызвать attr_accessor в метаклассе экземпляра, например:

class MyClass
  def initialize(varname)
    class <<self
      self
    end.class_eval do
      attr_accessor varname
    end
  end
end

o1 = MyClass.new(:foo)
o2 = MyClass.new(:bar)
o1.foo = "foo" # works
o2.bar = "bar" # works
o2.foo = "baz" # does not work
20
ответ дан 1 December 2019 в 20:29
поделиться