scala相当于python __getattr__/__setattr__

ts.*_*ts. 4 python scala properties dynamic getter-setter

是否有scala等效的python __getattr__ / __setattr__(以及其他__*__方法?).有些东西是内置的还是一些特征?

Deb*_*ski 11

对于您而言__getattr__,__setattr__您必须等到有更多洞察力的人描述新的Scala 2.10反射API.(当然:它永远不会直接翻译.它完全取决于你的用例.如果你只想要一个动态类,将来会有一个Dynamic特点;如果你只想要一点点,那么围绕模式匹配进行设计可能是一个明显的选择.)

至于Python中的众多其他__*__方法:

全球事物

  • __call__apply()//几乎完全相同的行为
  • __metaclass__ //使用案例依赖:
    • 目前class继承或traitmixins可能是有用的
    • 在许多情况下,所有元类都是实例构造,它避免了调用super(); 在Scala super()中始终在构造函数中调用.
  • __repr__,__str__toString()
  • __eq__equals()
  • __init__ //在类体中隐式调用
  • __new__//不直接存在; 取决于用例早期初始化
  • __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

值得注意的是,applyupdate特殊 Scala的,就像他们的Python的同行.它们允许以下语法:

val x = collection(elem) // val x = collection.apply(elem)
collection(elem) = y // collection.update(elem, y)
Run Code Online (Sandbox Code Playgroud)

同样,就像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__//在大多数情况下,函数参数实现了相同的目的

另请参阅:Scala的"魔术"功能列表