你能解释一下吗:

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

2)

perms:(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
) {
   ...
  }

最佳答案

技术部分

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

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

每个 perm 都是一个 Tuple 函数。
(Perm => Unit) 对的第一个函数接收 Perm 并且不返回任何内容 ( Unit ) - 如果您是 cjava 人,请将 Unit 读作 void 。所以,这个函数的主要用途应该是改变 Perm(一个 mutator aka 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_= _ 是一个函数,它遵守为 Tuple ( Perm => Unit )
  • 的第一种类型定义的契约
  • file._u _ 也是一个函数,它尊重元组 (() => Perm)
  • 的第二个类型参数的定义契约

    file._u_= 上, u_=file ( FilePerms 的一个实例)上的一个 mutator 方法。 mutator 接收一个 Perm ,将其存储在 file 中并且不返回任何内容( Unit )。尾随的 _ 是一个神奇的转换操作符,它让 FilePerms 上的 setter 方法 表现为 函数 ( Perm => Unit )

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

    如果方法和函数之间的区别变得模糊不清,特别是在所有这些 val 周围。阅读 Daniel Sobral 的 this answer

    概念部分

    此代码执行以下操作:

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

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

    最后, PermSet 伴侣对象声明了一些权限( ugo )(将它们视为 Java static 方法),每个人都会收到一个 FilePerms 实例并返回一个 PermSet 能够改变和访问该特定权限。因此,将它们视为能够从 PermSet 中提取默认 FileSet 的静态方法。例如。 u(myFile) 将返回一个能够访问和操作 PermSet 用户权限的 myFile

    关于Scala 表达式,我需要了解它的部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22073339/

    10-11 04:30