Scala表达,我需要了解它的各个部分

时间:2014-02-27 15:43:07

标签: scala expression

你能解释一下我吗:

1) 在PermSet中,初始化val的行: 为什么可以写“文件。 = _”? file._u我能理解,但其余的不是......

2)

烫发:( Perm => Unit,()=> Perm)* - 这是什么意思?

case class PermSet(file:FilePerms, perms:(Perm => Unit, () => Perm)* ) {

}



object PermSet {
    val u   =  (file:FilePerms) => new PermSet(file,(file._u_= _ , file._u _))
    val g   =  (file:FilePerms) => new PermSet(file,(file._g_= _ , file._g _))
    val o   =  (file:FilePerms) => new PermSet(file,(file._o_= _ , file._o _))
    ...
}



class FilePerms(
   var _u:Perm=none,
   var _g:Perm=none,
   var _o:Perm=none
) {
   ...
  }

3 个答案:

答案 0 :(得分:2)

2)perms:(Perm => Unit, () => Perm)*

  • 星号*符号表示该函数采用此类型的可变数量的参数。
  • (X,Y)形式是一对或Tuple2[+T1, +T2]
  • Perm => Unit表示你需要传递一个带有Perm参数并返回Unit的函数 - 基本上不返回任何内容,所以它很可能会产生副作用。同样地,() => Perm意味着它期望一个没有args的函数返回Perm

1)下划线_是一个占位符 - 当调用该函数时,变量将放在那里。因此,如果您使用此语法file._u_= _,则意味着在调用此代码并将其分配给{{1}时,某些值将放在=的右侧,而不是_ }。作业不会返回任何内容,即file._u

答案 1 :(得分:2)

编译器会自动为每个类属性生成一个getter和setter。

class FilePerms {
    var _u:Perm=none
}

本质上变成了

class FilePerms {
    private var __u:Perm=none

    // Getter
    def _u = __u

    // Setter
    def _u_=(v:Perm) {
        __u = v
    }
}

因此file._u_=_u属性的设置者。

如果要将方法作为对象访问,请在其后添加下划线。

如果你想将setter传递给另一个方法或构造函数,你会说

file._u_= _

答案 2 :(得分:2)

技术部分

case class PermSet(file:FilePerms, perms:(Perm => Unit, () => Perm)* )

是一个案例类,它接收具体的FilePerms实例以及perms的可变数字(0或更多)。

每个烫发都是Tuple个功能。

(Perm => Unit)的第一个函数收到Perm并且不返回任何内容(Unit) - 如果您是cjava家伙,将Unit读为void。所以,这个函数的主要用途应该是变异Perm(一个mutator又是setter)。

(() => Perm)的第二个函数是一个没有参数的函数,它返回一个Perm(看起来像一个访问者,也就是getter)。

现在

val u = (file:FilePerms) => new PermSet(file, (file._u_= _ , file._u _))

u是一个接收一些具体FilePerms并从中创建PermSet的函数。

  • (file._u_= _ , file._u _)Tuple
  • file._u_= _是一个尊重第一种TuplePerm => Unit
  • 的定义合约的函数
  • file._u _也是一个尊重元组的第二个类型参数的定义合约的函数(() => Perm

file._u_=上,u_=file上的一个mutator方法(FilePerms的一个实例)。 mutator收到Perm,将其存储在file中并且不返回任何内容(Unit)。尾随_魔法转换运算符,可让FilePerms上的setter 方法表现为函数({ {1}})

以同样的方式,在Perm => Unit上,file._u _是一个没有参数(_u)的访问器方法,它返回()(来自Perm) 。再次file触发转换,其中访问器方法作为函数展开(_)。

如果方法和功能之间的差异变得模糊,特别是所有这些() => Perm周围。阅读Daniel Sobral的this answer

概念部分

此代码执行以下操作:

声明用户(val),组(u)和其他(g)实例权限(u)。可以将此类视为特定文件或目录的具体权限。

声明一个案例类FilePerms,它接收PermSet和零个或多个FilePerms的实例,它们只不过是可以变异和访问权限的函数元组。此类的目的是以一种方式包装实例权限,以便仅公开您希望某人能够访问和/或变异的权限。这里隐藏的概念关键词是perms。该文件具有权限grant,您可以使用FilePerms过滤应该公开的权限。

最后,PermSet个随播广告对象宣布了一些权限(PermSetug)(将其视为Java o方法)一个人将收到一个static的实例,并返回一个FilePerms能够改变和访问该特定权限。因此,将它们视为能够从PermSet中提取默认PermSet静态方法。例如。 FileSet将返回u(myFile)能够访问和操作PermSet用户权限。