Возможно ли получить синтаксис
foo$bar(x) <- value
для работы, где foo
- это объект ссылочного класса, а bar
- это метод?
То есть возможно ли сделать «назначение подмножества» и иметь «функции замены» в качестве методов в эталонных классах?
Возможен ли синтаксис для других систем OO?
Пример:
Я проиллюстрирую это на вымышленном примере использования. Представьте себе справочный класс Person
, который содержит некоторую базовую информацию о человеке. В частности, одно поле с именем fullname
является именем list
:
PersonRCGen <- setRefClass("Person",
fields = list(
fullname = "list",
gender = "character"
))
Далее, мы должны определить некоторые методы для получения и установки определенных имен в списке fullnames
, которые (пытаются) дать приведенный выше синтаксис / интерфейс. Моя лучшая попытка до сих пор была:
PersonRCGen$methods(
name = function(x) { # x is the dataset,
.self$fullname[[x]]
},
`name<-` = function(x, value) {
.self$fullname[[x]] <- value
}
)
Имена здесь также должны иллюстрировать то, что я пытаюсь сделать.
Мы инициализируем новый объект:
a_person <- PersonRCGen$new(fullname = list(first = "Jane", last = "Doe"),
gender = "F")
Прямой доступ к полю fullname
и доступ к имени и фамилии с помощью определенной функции get работает, как и предполагалось:
a_person$fullname
#$`first`
#[1] "Jane"
#
#$last
#[1] "Doe"
a_person$name("first")
#[1] "Jane"
a_person$name("last")
#[1] "Doe"
Однако для задания определенного имени в списке fullname
мне бы хотелось иметь следующий синтаксис / интерфейс, который, к сожалению, не работает.
a_person$name("first") <- "Jessie"
#Error in a_person$name("first") <- "Jessie" :
# target of assignment expands to non-language object
Мне известны следующие работы (которые в основном делают метод плохо названным).
a_person$`name<-`("first", "Johnny")
a_person$fullname
#$`first`
#[1] "Johnny"
#
#$last
#[1] "Doe"
В моем реальном случае использования я бы хотел избежать "традиционных" getName(x)
и setName(x, value)
имен для функций get и set.