方法定义和使用
Ruby中的方法需要在调用之前定义,并且首字母小写。
#!/usr/bin/ruby
def myFun(a="lzh",b="sb")
puts("#{a} is a #{b}")
end
i="who"
j="cat"
myFun(i,j)
myFun()
[lzh@hostlzh Ruby]$ ruby 4.rb
who is a cat
lzh is a sb
[lzh@hostlzh Ruby]$
默认返回值
Ruby中的方法默认返回最后一条语句的执行结果值。
#!/usr/bin/ruby
def myFun(a="lzh",b="sb")
puts("#{a} is a #{b}")
@c="返回值"
end
i="who"
j="cat"
retval=myFun(i,j)
puts(retval)
如果这条语句不涉及什么结果呢?返回的是nil。
#!/usr/bin/ruby
def myFun(a="lzh",b="sb")
puts("#{a} is a #{b}")
end
i="who"
j="cat"
retval=myFun(i,j)
puts(retval)
[lzh@hostlzh Ruby]$ ruby 4.rb
who is a cat
nil
[lzh@hostlzh Ruby]$
设定返回值
和其它高级语言一样,可以用return语句去改变方法的返回值,同时会导致方法的结束。return多个值时,返回的是包含它们的数组。
#!/usr/bin/ruby
def myFun(a="lzh",b="sb")
puts("#{a} is a #{b}")
@c="我还是返回值吗"
puts("第5行执行了吗")
return a,b
puts("第7行执行了吗")
end
i="who"
j="cat"
retval=myFun(i,j)
puts(retval)
[lzh@hostlzh Ruby]$ ruby 4.rb
who is a cat
第5行执行了吗
who
cat
[lzh@hostlzh Ruby]$
可变参数
这一点和python用法很像,和使用数组一样去使用这些参数。
#!/usr/bin/ruby
def myFun(*a)
puts("a是#{a}")
puts("a的长度是#{a.length}")
#循环地去使用它
for i in 0...a.length: #用'...'以不包含a.length这个越界下标
print("a[#{i}]=#{a[i]}")
puts
end
end
myFun(36,"lzh",'%',-7.38)
[lzh@hostlzh Ruby]$ ruby 4.rb
a是36lzh%-7.38
a的长度是4
a[0]=36
a[1]=lzh
a[2]=%
a[3]=-7.38
[lzh@hostlzh Ruby]$
类方法与实例方法
和java的思想非常像,在语法上Ruby的类方法要用类名.方法名来定义。
#!/usr/bin/ruby
class MyClass
@@cls_var="class variable" #类变量
def initialize(name)
puts("你用\"#{name}\"作为参数构造了一个对象")
end
def MyClass.cls_mthd() #类方法
puts("i am class method")
puts("can i use #{@istc_var} ?") #打印不出来,说明不能使用
puts("i can use #{@@cls_var}")
puts
end
def istc_mthd() #实例方法
@istc_var="instance variable" #实例变量
puts("i am instance method")
puts("i can use #{@istc_var}")
puts("i can use #{@@cls_var}")
puts
end
end
liusb=MyClass.new("lzh")
liusb.istc_mthd() #使用实例方法
MyClass.cls_mthd() #直接使用类方法
在类加载时就有类方法和类变量了,而没有实例方法和实例变量,所以在类方法里是不能使用它们的(不过竟然也不会报错)。
[lzh@hostlzh Ruby]$ ruby 4.rb
你用"lzh"作为参数构造了一个对象
i am instance method
i can use instance variable
i can use class variable
i am class method
can i use ?
i can use class variable
[lzh@hostlzh Ruby]$