R /二进制运算符重载中的简单OOP系统

Oli*_*ier 5 oop r

我正在探索R的功能,并试图构建一个非常简单的面向对象的编程系统。

这个想法是使用函数环境来存储对象属性,并重载“>”运算符以代替“”。通常在OOP语言中使用。这在下面实现。

`>.object` <- function (this, variable) {
  return(eval(substitute(variable), environment(this)))
}

new <- function (obj) {
  structure(unclass(obj), class="object")
}
Run Code Online (Sandbox Code Playgroud)

例如,我可以Dog使用bark如下方法创建一个类。

Dog <- function () {

  bark <- function() {
    print("Woof!")
  }

  return(new(function(){}))
}

max = Dog()
`>.object`(max, bark()) # Prints "Woof!"
Run Code Online (Sandbox Code Playgroud)

但是,当使用>内联运算符时,R会尝试bark()在全局环境中进行解析,如果未定义错误,则会产生错误。

max>bark() # Error in bark() : could not find function "bark"
Run Code Online (Sandbox Code Playgroud)

如果bark在全局环境中以某种方式定义了,那么就没有错误。

bark = function(){}
max>bark() # Prints "Woof!"
Run Code Online (Sandbox Code Playgroud)

有什么办法可以解决此问题,以便max>bark()始终返回“ Woof!”?

apc*_*53c 0

>.object语法适用于通用函数(例如,mean, print, summary)。这些定义为UseMethod()

> mean 
function (x, ...) 
UseMethod("mean")
<bytecode: 0x0000000017fc9f10>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)

>不是通用函数:

> `>`
function (e1, e2)  .Primitive(">")
Run Code Online (Sandbox Code Playgroud)

然而,它可以被重新定义为通用函数:

> mean 
function (x, ...) 
UseMethod("mean")
<bytecode: 0x0000000017fc9f10>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)

执行此操作后,运行问题中的代码会产生"Woof!"所需的输出。

缺点是你现在必须重新定义>基本数据类型,例如:

> `>`
function (e1, e2)  .Primitive(">")
Run Code Online (Sandbox Code Playgroud)