首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala中方法调用的间距不一致

Scala中方法调用的间距不一致
EN

Stack Overflow用户
提问于 2015-01-02 17:08:42
回答 1查看 62关注 0票数 0

我有一个关于getter/setter的课程:

代码语言:javascript
运行
复制
class Person {
    private var _age = 0

    //getter
    def age = _age

    //setter
    def age_=(value: Int): Unit = _age = value

    def echo(x: String): Unit = println(x)
}

我做了一些测试:

代码语言:javascript
运行
复制
val p = new Person()
//invoke age setter method
p.age =(2)
p age = 11
p.age = 8-4

// invoke echo method
p.echo("Hello")
p echo "Scala"
p.echo "Johnson"    //compile error here

因此,我在以下位置得到编译错误:

代码语言:javascript
运行
复制
p.echo "Johnson"

带有错误信息:

代码语言:javascript
运行
复制
Error:(84, 16) ';' expected but string literal found.
        p.echo "Johnson"    //compile error here (why scala?)
               ^

为什么p.age = 8-4工作正常,但我在p.echo "Johnson"上出错了?是因为_= in def age_=吗?

更新:

我做了一个实验:

代码语言:javascript
运行
复制
class Person {

    ...

    def echo = "Ginger"
    def echo_=(x: String): Unit = println(x)
}

然后更改echo方法,调用:

代码语言:javascript
运行
复制
p.echo= ("Hello")
p echo= "Scala"
p.echo= "Johnson"

它们运转得很好。但是如果我删除了def echo = "Ginger",我就会得到编译错误。

因此,基于这一观察,我得出结论: setter方法的“魔力”取决于getter方法。如果没有定义getter方法,魔法就消失了。

但这意味着我不能创建一个setter (只写)方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-02 17:35:55

这是因为无点scala语法只允许您在删除点时删除括号:

代码语言:javascript
运行
复制
1 + 2   // 3
1.+(2)  // 3

1.+ 2
// <console>:1: error: ';' expected but integer literal found.
//   1.+ 2
//       ^

基本上,它认为您试图调用一个no-arg方法echo,然后在它后面有一个随机字符串文本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27745787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档