Groovy探索之运算符的重载 二
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
前一篇详细的说了说算术运算符和关系运算符的重载,这篇要说说赋值运算符和取值运算符,即“.”运算符的重载。
还是以前一篇的Yuan类来作为例子。
class Yuan
{
def num
def toString()
{
this.num
}
}
有了上面的类的定义,我们就可以如下使用这个类:
def y = new Yuan()
y.num = 109
println y.toString()
其中,“y.num = 109”就是一个赋值语句,关键的运算符就是“.”;当然,我们还可以用该运算符进行取值运算,如下:
println y.num
我们今天要说的就是对“.”运算符的重载。当然,只要我们稍微一想,就可以知道,该运算符应该和“set”和“get”方法有关。不错,的确如此。
下面,我们来看看如何重载“.”运算符。
class Yuan
{
def num
def getOwner()
{
print 'tom'
}
def toString()
{
this.num
}
}
要重载取值运算,当然只要“get”方法就行了,注意看代码中的“getOwner()”方法,实现了它,我们就可以写出“y.owner”这样的代码来。
下面来看我们的测试代码:
def y = new Yuan(num:100)
y.owner
println " has ${y.toString()} yuan."
运行结果为:
tom has 100 yuan.
当然,重载赋值运算就和“set”方法相关了,如下:
class Yuan
{
def num
def setOwner(name)
{
println name
}
def toString()
{
this.num
}
}
测试代码如下:
def y = new Yuan(num:100)
y.owner = 'mike'
可以看到,“.”运算符的重载跟其他运算符的重载也都一样,没有什么特别的地方。但为什么要把它拿出来单独成一篇呢?这是因为它跟DSL有很大关系,是Groovy语言实现DSL的一种方式。
下面就来说一说如何使用“.”运算符来实现DSL的。
一直以来,我们都希望计算机能够识别我们人类的自然语言,如它能够帮我们计算这样的题目:
12元+39毛+123分
当然,现在的计算机还不能做到这样的场景。但是,现在有了DSL,我们能做到这样的场景:
12.yuan+39.jiao+123.fen
这样,就相当的接近我们的自然语言了。那么,Groovy语言是怎么实现上面的场景的呢?
一看到“12.yuan”这样的表达式,我们就可以想到,这不就是一个取值运算吗?我们可以重载“.”运算符。
不错,Groovy语言正是通过重载“.”运算符帮我们实现上面的场景的。既然要重载“.”运算符,那么“12”又是一个什么对象呢?在Groovy语言中一切都是对象,“12”是一个Integer对象。
对啦,我们只需要在Integer类里实现getYuan()方法,就可以重载取值运算符。但Integer类是一个已经存在的类,我们不能直接修改它。
那么我们怎么给Integer类添加getYuan()方法呢?是的,通过metaClass,即元对象。
下面是实现上面的场景的代码:
def mc = new ExpandoMetaClass(Integer.class,true)
mc.getYuan <<
{
->
delegate as float
}
mc.getJiao <<
{
->
def j = delegate as float
j/10
}
mc.getFen <<
{
->
def f = delegate as float
f/100
}
mc.initialize()
首先取得Integer类的元对象:“def mc = new ExpandoMetaClass(Integer.class,true)”。
然后,再添加各个“get”方法,因为我们只需要实现取值运算,因此,只需要实现“get”方法就可以了。
最后实例化这个元对象,即“mc.initialize()”
现在,我们来测试这段代码:
println 12.yuan+45.jiao+33.fen
结果为:
16.83
运算符的重载是Groovy语言实现DSL的一个很重要的方面,因此,我们拿出两个章节才把它说完,希望我们在今后的编码实践中经常的使用到它。
分享到:
相关推荐
此外,Groovy的运算符重载和元编程能力使代码更加简洁和动态。 在安装GroovyEclipse插件后,开发者可以通过Eclipse的New -> Groovy Project来创建Groovy项目。插件还会提供Groovy编译器,确保代码的正确性。同时,...
运算符重载、位运算符和复合赋值运算符也是重点。 18. **赋值运算符**:Groovy的赋值运算符比许多其他编程语言的要简单。简单赋值运算符直接将右边表达式的结果赋值给左边的变量。 19. **条件运算符**:包括条件与...
5. **运算符重载和方法默认参数**: Groovy允许操作符重载和方法定义默认参数,增强了代码的可读性和灵活性。 **二、Groovy与Java的交互** 1. **类和接口**: Groovy可以创建Java兼容的类和接口,因此可以直接与Java...
4. **Operator Overloading(运算符重载)**:Groovy允许自定义运算符的行为,增加代码的灵活性。 5. **Metaprogramming(元编程)**:Groovy提供了丰富的API来修改或扩展程序的结构和行为,甚至在运行时。 对于...
5. **运算符重载和方法缺失**:Groovy允许自定义运算符,同时,如果对象没有某个方法,Groovy会尝试寻找与之相似的方法名,这被称为方法缺失。 6. ** Grape**:Grape是Groovy的依赖管理工具,类似Java的Maven或...
6. **运算符重载和元编程**: Groovy允许自定义运算符行为,并可以通过元编程动态修改类的行为。 ### Groovy实例 下面是一些简单的Groovy代码示例,展示其语法的简洁性: ```groovy // 定义一个类 class Person { ...
Groovy的设计哲学是让程序员能够用更少的代码做更多的事情,这体现在它的语法上,如无需声明变量类型、支持闭包和运算符重载等特性。 #### 字符串的种类与特性 Groovy中的字符串处理与Java有所不同,主要表现在字符...
- **表达式**:Groovy支持使用各种表达式,包括数字、变量、运算符等。 - **Java类的使用**:可以直接使用Java中的类和方法,甚至在表达式中。 - **方法定义**:定义方法与Java相似,但Groovy中可以省略`return`...
- **运算符重载**:Groovy允许用户自定义运算符的行为。 - **多重方法**:允许相同名称的方法具有不同的行为,这取决于传入参数的类型。 - **列表、映射、范围和正则表达式的字面量声明**:Groovy提供了简洁的方式来...
它还支持运算符重载,可以根据需要自定义操作符的行为。 4. **程序结构(Program structure)**:在Groovy中,可以使用包名和导入语句组织代码,同时支持脚本和类两种主要的程序结构形式。 5. **面向对象(Object ...
2. **语法简洁性**:Groovy的语法比Java更为简洁,如三元运算符、方法链和闭包等,使得代码更易读写。 3. **闭包**:Groovy中的闭包是其核心特性之一,类似于JavaScript的函数引用,可以作为参数传递,也可以作为...
7. **运算符重载**:Groovy允许自定义运算符,这使得创建符合直觉的类和接口变得更加简单。 8. **GroovyShell和GroovyScriptEngine**:这两个工具允许在运行时执行Groovy代码,非常适合快速原型开发和脚本编写。 9...
8. **Operator Overloading**: Groovy支持运算符重载,允许开发者为自定义类定义如何处理各种运算符。 9. **GDK (Groovy Development Kit)**: Groovy提供了一套扩展的Java标准库,称为GDK,包含许多方便的方法,如`...
包括基本语法、习惯用语、编码风格、基础类型、包、控制流、返回与跳转、...运算符重载、空安全、异常、注解、反射、动态类型、互用性、工具、动态类型、Kotlin代码文档、构建工具使用(如Maven、Ant、Griffon和Gradle...
- **运算符重载**: 可以为类重载运算符。 - **空安全**: Kotlin的设计目标之一就是避免空指针异常。 - **异常**: 提供了标准的异常处理机制。 - **注解**: 用于提供额外的元数据。 - **反射**: 提供了反射API来查询...
- **发展背景**:随着互联网的发展,Java 成为了企业级应用、Web 应用和移动应用等领域的首选编程语言之一。 - **版本演进**:自 1995 年以来,Java 经历了多次重大更新,包括 Java 2 (J2SE)、Java 5、Java 8 等,...