你能解释一下吗:
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
) - 如果您是 c
或 java
人,请将 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
伴侣对象声明了一些权限( u
、 g
、 o
)(将它们视为 Java static
方法),每个人都会收到一个 FilePerms
实例并返回一个 PermSet
能够改变和访问该特定权限。因此,将它们视为能够从 PermSet
中提取默认 FileSet
的静态方法。例如。 u(myFile)
将返回一个能够访问和操作 PermSet
用户权限的 myFile
。关于Scala 表达式,我需要了解它的部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22073339/