是否有scala等效的python __getattr__ / __setattr__
(以及其他__*__
方法?)。有些东西是内置的还是某些特征?
答案 0 :(得分:11)
对于__getattr__
和__setattr__
,您必须等到有更多洞察力的人描述新的Scala 2.10反射API。 (当然:它不会直接翻译。它完全取决于你的用例。如果你只想要一个动态的类,将来会有一个Dynamic
特性;如果你只是想要一个小的这一点,然后围绕模式匹配进行设计可能是一个明显的选择。)
对于众多other __*__
methods in Python:
__call__
→apply()
//几乎完全相同的行为__metaclass__
//依赖于用例:
class
继承或trait
mixins可能有用super()
;在Scala super()
中始终在构造函数中调用。__repr__
,__str__
→toString()
__eq__
→equals()
__init__
//在类主体中隐式调用__new__
//不直接存在;取决于用例 early initialisation __del__
// 缺少 __nonzero__
//不是真的,除了implicit def toBool[MyType](a: MyType): Boolean = ...
__len__
⇝length
,size
或容器中的约定__getitem__
→apply(i: IndexType)
//容器是Scala中的函数__setitem__
→update(i: IndexType, v: ValueType)
__delitem__
//无需特殊处理;容器惯例__iter__
→foreach(block: ValueType => Unit)
//返回值为:map
,flatMap
值得注意的是,apply
和update
在Scala中是特殊,就像他们的Python对应物一样。它们允许以下语法:
val x = collection(elem) // val x = collection.apply(elem)
collection(elem) = y // collection.update(elem, y)
同样,正如Python __iter__
允许使用(el for el in container)
foreach
和map
这样的语法,可以说for (el <- container) yield el
。
通常不需要特殊处理,因为我们可以直接定义:
__add__
,__sub__
,... //只需定义def + (arg: T)
或def - (arg: T)
这还包括比较运算符
__lt__
,__ge__
→def <(other: T)
,def <=(other: T)
然而,就像在Python中一样,编译器中有一些特殊情况用于高级事物:
__radd__
,__rsub__
,... //右关联运算符;约。 def +: (arg: T)
或def -: (arg: T)
(附加:
)__iadd__
,__isub__
,... //修改运算符:def += (arg: T)
,... __enter__
,__exit__
//在大多数情况下,函数参数实现了相同的目的答案 1 :(得分:2)
我不确定这里有什么意义。 Scala的统一访问原则意味着“字段”和方法共享相同的接口 - 因为事实上,Scala中的“字段”是getter和setter。
换句话说,您可以像这样替换它们:
var x: Int = 0
private[this] var _x = 0
def x = _x
def x_=(n: Int) { _x = n }
getter和setter方法将控制对您声明的私有字段的访问。
现在,如果您想要的只是一种提供非静态字段的方法,那么您必须查看动态特征。它的实验性高达2.9.2,但它将在2.10上可用,但是在一个标志后面警告人们这个功能是危险的(因为它引入了动态类型,但如果你不认为动态类型是危险的,你应该是细)。