Syntax 奥德斯基是认真对待”的吗;比尔*&;^%~密码&引用;?

Syntax 奥德斯基是认真对待”的吗;比尔*&;^%~密码&引用;?,syntax,scala,obfuscation,puzzle,Syntax,Scala,Obfuscation,Puzzle,在他的书《scala编程》(第5章第5.9节第93页)中 奥德斯基提到了这句话“bills!*&^%~code!” 在同一页的脚注中: “到现在为止,您应该能够理解,给定这段代码,Scala编译器将 调用(bills.!*&^%~(code)).!()“ 这对我来说有点神秘,有人能解释一下这里发生了什么吗?我不确定这本书是否提供了方法签名,但我认为这只是对Scala语法糖的注释,因此如果您键入: bill add monkey 如果有一个对象账单,其方法add采用一个参数,那么它会自动将其解释

在他的书《scala编程》(第5章第5.9节第93页)中 奥德斯基提到了这句话“
bills!*&^%~code!

在同一页的脚注中:

“到现在为止,您应该能够理解,给定这段代码,Scala编译器将

调用
(bills.!*&^%~(code)).!()“


这对我来说有点神秘,有人能解释一下这里发生了什么吗?

我不确定这本书是否提供了方法签名,但我认为这只是对Scala语法糖的注释,因此如果您键入:

bill add monkey
如果有一个对象账单,其方法add采用一个参数,那么它会自动将其解释为:

bill.add(monkey)

由于Scala有点生疏,我不完全确定它是如何拆分代码的!进入(代码)。!()除了那灰色细胞发出的隐约的痒痒声!运算符用于触发一个在编译器术语中可能被解释为隐式的参与者。!()对象上的方法。

对于调用采用单个参数或具有空参数列表的方法,句点是可选的

使用此功能时,将假定方法名称后面的空格后的下一个块为单个参数

所以,

(法案)!*&^%~(代码))。!()

与相同

账单!*&^%~密码


第二个感叹号根据第一个方法调用的返回值调用一个方法。

奥德斯基的意思是,可能会有这样的有效代码。例如,下面的代码:

class BadCode(whose: String, source: String) {
  def ! = println(whose+", what the hell do you mean by '"+source+"'???")
}

class Programmer(who: String) {
  def !*&^%~(source: String) = new BadCode(who, source)
}

val bills = new Programmer("Bill")
val code = "def !*&^%~(source: String) = new BadCode(who, source)"
bills !*&^%~ code!
只需将其复制并粘贴到REPL上。

将“()”与方法调用(如Wysawyg上面解释的)结合起来是可选的,并且能够(几乎)使用您喜欢的任何字符来命名方法,这使得在Scala中编写类似于运算符重载的方法成为可能。你甚至可以发明自己的操作符

例如,我有一个处理3D计算机图形的程序。我有自己的类
Vector
,用于表示三维向量:

class Vector(val x: Double, val y: Double, val z: Double) {
    def +(v: Vector) = new Vector(x + v.x, y + v.y, z + v.z)

    // ...etc.
}

我还定义了一个方法
**
(上面未显示)来计算两个向量的值。您可以在Scala中创建自己的运算符,这非常方便,没有多少其他编程语言具有这种灵活性。

+1用于解释可选的“.”,那么这个嘈杂的“!*&^%~”呢stacker:在Scala中,您可以使用(几乎)任何您喜欢的字符来命名方法。这只是一个名为
!*&^%的方法~+1用于解释可选的“()”,那么这个嘈杂的“!*&^%~”呢它们有意义吗?@Daniel非常感谢你提供了这个惊人的例子。您应该获得一枚scala balck腰带徽章。@stacker我有一枚金徽章,现在就足够了。:-)我个人认为奥德斯基先生应该避免混乱的大量符号,并用ASCII码写下亵渎的内容。至少,这是我想要的✻❀king do.还没有人解释这个“。@ziggystar问题缺少结束语。这不是代码的一部分。