你能解释一下我吗:
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
) {
...
}
答案 0 :(得分:2)
2)perms:(Perm => Unit, () => Perm)*
:
*
符号表示该函数采用此类型的可变数量的参数。 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
) - 如果您是c
或java
家伙,将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_= _
是一个尊重第一种Tuple
(Perm => 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
个随播广告对象宣布了一些权限(PermSet
,u
,g
)(将其视为Java o
方法)一个人将收到一个static
的实例,并返回一个FilePerms
能够改变和访问该特定权限。因此,将它们视为能够从PermSet
中提取默认PermSet
的静态方法。例如。 FileSet
将返回u(myFile)
能够访问和操作PermSet
用户权限。