Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何为默认构造函数参数定义访问器方法?_Scala - Fatal编程技术网

Scala 如何为默认构造函数参数定义访问器方法?

Scala 如何为默认构造函数参数定义访问器方法?,scala,Scala,正在尝试为默认构造函数参数定义访问器方法,即: class Person (age: Int) { def age: Int = this.age } 这显然会导致编译器错误:对重载定义的引用不明确,类型为=>Int的类Person中的方法年龄和类型为Int的类Person中的值年龄都与预期的类型Int匹配 在此上下文中,是否有方法区分成员方法名称和自动生成的成员值名称 当然,可以更改任一标识符的名称,但在这种情况下,是否有办法实际指定引用哪个标识符?只需将“val”放在要作为实例属性

正在尝试为默认构造函数参数定义访问器方法,即:

class Person (age: Int) {
    def age: Int = this.age
}
这显然会导致编译器错误:对重载定义的引用不明确,类型为=>Int的类Person中的方法年龄和类型为Int的类Person中的值年龄都与预期的类型Int匹配

在此上下文中,是否有方法区分成员方法名称和自动生成的成员值名称

当然,可以更改任一标识符的名称,但在这种情况下,是否有办法实际指定引用哪个标识符?

只需将“val”放在要作为实例属性公开的构造函数参数前面。

使用

class Person (val age: Int)
如果你只是想要一个getter或者

class Person (var age: Int)

如果您还需要一个setter。

以上答案与统一访问原则相比非常好。如果您有或需要Java风格的getter和setter,也可以使用BeanProperty注释

class Person(@scala.reflect.BeanProperty var age: Int)
这将导致创建以下方法:

def getAge: Int = age
def setAge(age: Int) = this.age = age
如果将BeanProperty用于val而不是var,则不会创建setter,只创建getter


另一个警告是,不能从Scala内部调用setter方法。相反,您应该使用统一访问的标准Scala约定来设置值

为了完整性和扩展前面的答案,这里还介绍了一些技巧

总而言之,我总是从一个不可变的值开始:

class Person (val age: Int)
然后,如果您发现需要更改该值(或者您事先知道),请切换到:

class Person (var age: Int)
然后,如果需要对get或set进行验证或其他计算,请重命名变量并生成模仿原始命名的访问器,无需重构其余代码:

class Person(var _age: Int)
{
   def age =
   {
      println("age requested")
      _age
   }
   def age_=(newAge: Int) =
   {
      assert(newAge > 0)
      println(s"age changed from ${_age} to $newAge")
      _age = newAge
   }
}
当然,如果不需要操作,可以简化setter或getter


感谢所有其他答案,它们确实是正确的,而且来得更快。

谢谢!我自己就想出来了。:-)但是如果我想覆盖默认的访问器呢?我想我仍然需要重命名参数?是的,您需要重命名参数(例如
age0
),然后定义访问器
def age={Math.abs(age0)