论坛首页 编程语言技术论坛

Ruby语法一问

浏览 8262 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-10-16  
def name = ( new_name )
  @name = new_name
end
请问这个相当于JAVA中的什么表达呢?
另:
def name
  @name
end
可不可以理解为给实例变量赋值和取值均用instance.name就行?
   发表时间:2006-10-16  
斗胆回一个,不知对否
def name = ( new_name )
@name = new_name
end
public object setName(Object new_name){
  this.name=new_name
}
0 请登录后投票
   发表时间:2006-10-16  
def name = ( new_name )
 @name = new_name
end


可以看作是定义了一个=号运算符。

def name
  @name
end 


相当于getter。
0 请登录后投票
   发表时间: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后呢?
0 请登录后投票
   发表时间: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)。。。
0 请登录后投票
   发表时间:2006-10-16  
噢~感谢楼上哥哥们精彩的回复~在ruby语言中,def方法不能同名,否则会覆盖,那是不是意味着不存在JAVA语言中<重置>的概念了呢?
0 请登录后投票
   发表时间:2006-10-16  
ruby的重载比java复杂多了,具体请看斧头书。不过动态语言都复杂……

PS:楼主好可爱
0 请登录后投票
   发表时间:2006-10-17  
在Ruby中,方法是存放到Hash表中,而键值就是方法名,所以,定义一个方法就是在Hash表中添加一项的过程,因此,后定义的同名方法就会替换掉之前定义的方法。

Ruby语言支持缺省参数,但不支持方法重载,因为二者有着类似的功效,比较容易带来混淆。C++的选择是二者都支持,而Java的选择刚好与Ruby相反,即支持方法重载,而不支持缺省参数。

如果想在Ruby语言中支持方法重载,有一些问题需要解决。在C++中,解决方法重载是利用了一种naming mangling的技术,也就是为给函数名加上了参数的类型信息,以达到实际上的唯一。我们知道,在Ruby程序中,变量的类型信息是不体现在代码上的,因此,不能像C++这样利用类型信息。可以考虑的是变量数,即方法名加变量数,作为存放到Hash表中的键值。因为Ruby已经支持了缺省参数,考虑兼容性,这个特性还要继续支持。但是,这样带来的问题就是,用一个参数调用函数,如果找不到,那就需要找同名的多参数的方法,也就是两个参数、三个参数……,这是一个开区间,无法枚举。

对于同样的问题,Python做了同样的选择,即支持缺省参数,而不支持方法重载。

对于Ruby实现的问题,我写过两篇blog讨论,可以作为参考。
管窥Ruby——对象基础
管窥Ruby——类的方法
0 请登录后投票
   发表时间:2006-10-17  
j2eeqk 写道
噢~感谢楼上哥哥们精彩的回复~在ruby语言中,def方法不能同名,否则会覆盖,那是不是意味着不存在JAVA语言中<重置>的概念了呢?


这个做个测试就知了:
在JAVA中,可以定义多个同名方法(参数不同),调用的时候会根据参数的不同而找到匹配的那个,但RUBY中就不行,只有最后一个会被调用,这一点好像不如JAVA方便,但会造成什么麻烦就没有想出来
0 请登录后投票
   发表时间:2006-10-18  
dreamhead说的很清楚,java不支持可选参数所以实现重载没有问题。

重载很方便么?你想想重载的方法是不是逻辑近似的代码?以前仅仅为了参数类型不同就要重载,现在有泛形减少了很多不必要的重载。

在支持类型推断的语言如Ocaml,Haskell里也不支持重载,因为这让参数类型推断变得非常困难。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics