【问题标题】:Use of the `private` (and `define/private`) form in a Racket class在 Racket 类中使用“private”(和“define/private”)形式
【发布时间】:2017-08-10 21:38:58
【问题描述】:

Racket 的classs 有一个private 表单,可以用来隐藏方法。这似乎模仿了在 Java 或 C# 等其他语言中使用 private。 The docs 展示了一个使用 private 隐藏方法的例子:

(define light%
  (class object%
    (super-new)
    (define on? #t)
    (define (toggle) (set! on? (not on?)))
    (private toggle)
    (define (flick) (toggle))
    (public flick)))

> (send (new light%) toggle)
send: no such method
  method name: toggle
  class name: light%
> (send (new light%) flick)

但是,默认情况下,方法似乎是私有的,无论是否实际使用了 private 关键字。例如,修改文档中的示例会产生相同的结果:

(define light%
  (class object%
    (super-new)
    (define on? #t)
    (define (toggle) (set! on? (not on?)))
    (define (flick) (toggle))
    (public flick)))

> (send (new light%) toggle)
send: no such method
  method name: toggle
  class name: light%
> (send (new light%) flick)

在这两种情况下,类之外的作用域都无法访问toggle,但它们可以访问flick,因为它被标记为public

那么,private 是用来做什么的,为什么它仍然是语言?

【问题讨论】:

    标签: class oop object racket scoping


    【解决方案1】:

    在第二种情况下,toggle 不是方法;它是一个私有字段,其值为闭包。特别是,为每个 light% 对象分配了一个新的 toggle 闭包。

    使用(private toggle)toggle 方法定义被转换为为this 提供一个额外的参数,并通过该参数解析字段引用。像这样的:

    (define (toggle-impl this-obj)
      (set-light%-on?! this-obj (not (light%-on? this-obj))))
    

    由于它不再关闭this,该过程可以与类同时分配一次。 class 宏将toggle 绑定到一个宏,该宏重写所有对toggle 的调用以传递隐式this 参数。 (这就是为什么方法名不是值的原因;如果你想map 一个方法在一个列表上,你必须 eta-expand 使方法名在操作符的位置。)

    【讨论】:

    • 好的。所以看起来这意味着分配一个方法而不是每个对象实例一个方法。这就说得通了。你能告诉我一个最终结果会不同的例子吗?
    • 我这么说是因为即使是'this',似乎也绑定在私有方法中:(define light% (class object% (super-new) (field [on?#t]) (define /private (toggle) (set!on? (not on?)) (displayln (get-field on?this))) (define (toggle2) (set!on?(not on?)) (displayln (get-field on? this))) (define/public (flick) (toggle2) (toggle))))
    • 啊,好吧,我想我明白了。这仅在您不进行 eta-expand 函数时才会出现。我明白了,谢谢。
    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 2012-11-04
    • 2013-12-02
    • 1970-01-01
    • 2017-09-14
    • 2015-03-22
    • 2019-03-23
    • 2011-03-05
    相关资源
    最近更新 更多