锁定老帖子 主题:Ruby语法一问
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-10-16
@name = new_name end 请问这个相当于JAVA中的什么表达呢? 另: def name @name end 可不可以理解为给实例变量赋值和取值均用instance.name就行? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-10-16
斗胆回一个,不知对否
def name = ( new_name ) @name = new_name end public object setName(Object new_name){ this.name=new_name } |
|
返回顶楼 | |
发表时间:2006-10-16
def name = ( new_name ) @name = new_name end 可以看作是定义了一个=号运算符。 def name @name end 相当于getter。 |
|
返回顶楼 | |
发表时间:2006-10-16
既然
def name = ( new_name ) @name = new_name end 相当于setter,那么为什么不这样写? def name( new_name ) @name = new_name end =号是不是可以去掉呢? 另: def name @name end 是getter,我明白了。当函数最后一个表达式为变量值的时候会自动作为函数的返回值。 既然是函数,没有形参,是不是可以加一个()在def name后呢? |
|
返回顶楼 | |
发表时间:2006-10-16
这是它的语法,习惯就好了。
obj.name等同于obj.name(),obj.name = new_name等同于obj.name=(new_name)。 你要写一个def set_name(new_name)也可以,但由于2个方法不能同名(同名会覆盖前一个),也就不能写成def name(new_name)。因为getter/setter使用很普遍,所以发明了def name=(new_name)。。。 |
|
返回顶楼 | |
发表时间:2006-10-16
噢~感谢楼上哥哥们精彩的回复~在ruby语言中,def方法不能同名,否则会覆盖,那是不是意味着不存在JAVA语言中<重置>的概念了呢?
|
|
返回顶楼 | |
发表时间:2006-10-16
ruby的重载比java复杂多了,具体请看斧头书。不过动态语言都复杂……
PS:楼主好可爱 |
|
返回顶楼 | |
发表时间:2006-10-17
在Ruby中,方法是存放到Hash表中,而键值就是方法名,所以,定义一个方法就是在Hash表中添加一项的过程,因此,后定义的同名方法就会替换掉之前定义的方法。
Ruby语言支持缺省参数,但不支持方法重载,因为二者有着类似的功效,比较容易带来混淆。C++的选择是二者都支持,而Java的选择刚好与Ruby相反,即支持方法重载,而不支持缺省参数。 如果想在Ruby语言中支持方法重载,有一些问题需要解决。在C++中,解决方法重载是利用了一种naming mangling的技术,也就是为给函数名加上了参数的类型信息,以达到实际上的唯一。我们知道,在Ruby程序中,变量的类型信息是不体现在代码上的,因此,不能像C++这样利用类型信息。可以考虑的是变量数,即方法名加变量数,作为存放到Hash表中的键值。因为Ruby已经支持了缺省参数,考虑兼容性,这个特性还要继续支持。但是,这样带来的问题就是,用一个参数调用函数,如果找不到,那就需要找同名的多参数的方法,也就是两个参数、三个参数……,这是一个开区间,无法枚举。 对于同样的问题,Python做了同样的选择,即支持缺省参数,而不支持方法重载。 对于Ruby实现的问题,我写过两篇blog讨论,可以作为参考。 管窥Ruby——对象基础 管窥Ruby——类的方法 |
|
返回顶楼 | |
发表时间:2006-10-17
j2eeqk 写道 噢~感谢楼上哥哥们精彩的回复~在ruby语言中,def方法不能同名,否则会覆盖,那是不是意味着不存在JAVA语言中<重置>的概念了呢?
这个做个测试就知了: 在JAVA中,可以定义多个同名方法(参数不同),调用的时候会根据参数的不同而找到匹配的那个,但RUBY中就不行,只有最后一个会被调用,这一点好像不如JAVA方便,但会造成什么麻烦就没有想出来 |
|
返回顶楼 | |
发表时间:2006-10-18
dreamhead说的很清楚,java不支持可选参数所以实现重载没有问题。
重载很方便么?你想想重载的方法是不是逻辑近似的代码?以前仅仅为了参数类型不同就要重载,现在有泛形减少了很多不必要的重载。 在支持类型推断的语言如Ocaml,Haskell里也不支持重载,因为这让参数类型推断变得非常困难。 |
|
返回顶楼 | |