打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ruby系列教材(26):More about methods(1)

本部分的内容对学习Rails有很大的意义,Rails中最常见的使用methods的方式:

redirect_to(:action => ‘index‘)

start_form_tag(:action => "save_order")

这里symbol object 还有 => 符号到底是什么意思?以及::这个符号的含义,本篇将会涉及

 

Method names

1.使用def关键字定义一个method

2.method name使用小写字母

3.method name可以使用?结尾,返回值为一个TrueClass或者FalseClass类型,意义上表示疑问,例如:

p [].empty?                # 意义:[]这个数组是空的吗?

结果:

true

 

def is_zero?(num)       # 带参数
  num==0
end
p is_zero?(1)
结果:
false

 

4.method name可以使用!结尾,表示这个method有一定的危险性,所谓的危险性就是method可以造成数据的丢失,!和?更多代表的是意义上的东西,而非语法上的东西

a = "I am here"
p a
a.chop!
p a
结果:

"I am here"
"I am her"

 

我们可以见到这样的情况,比如有些class有empty?这个method,用来判断是否非空,也有empty!这个method用来清空数据,这样的方式是让人很乐意见到的,表达起来也很舒服

 

5.method name后面可以加=,注意这将有点不同于前面说过的加!,?这么简单,除了意义上层面之外,还有语法层面的东西

回忆一下前面谈到的accessor methods(又叫attribute methods,简称attribute),accessor methods用于存取instance variables,对于reader attribute应该没有任何疑问,因为它就是一个普通的method,只是我们习惯上把它命名成为instance variable name而已,但是对于writer attribute,我们就应该注意了,它形如:

class T

  def initialize(t)

    @text = t

  end

  def text=(t)

    @text = t

  end

end

使用的时候如下:

t = T.new

t.text = "hi"     #text和=间有空格

 

也就说method name可以用=结尾,使用的时候=和前面的部分可以分开,这就是=于!,?在语法层面的差别(这是一个人性化的设计)。

在意义层面上说,accessor name要和它对应的instance variable相同(不要@符号),表示对有关vairable的存取

 

补充一下,我们同一的叫=,?,!等为suffix(后缀)

 

Method parameters

1.default values(默认值)

一个method可以为其parameters设定默认值,比如:

def test(args1="one",args2="two",args3="three")

  print args1," ",args2," ",args3," \n"

end

test

test(1)

test(1,2)

test(1,2,3)

结果:

one two three
1 two three
1 2 three
1 2 3

 

有default values的method,被赋予default value的parameter可以不需要在调用的时候传递一个arguments进去,假如没有默认值,则必须传递arguments :

def test(args1,args2)

  p args1," ",args2

end

test

结果:

in `test‘: wrong number of arguments (0 for 2) (ArgumentError)
    from -:6

 

2.Variable-Length Arugment Lists(可变长度的参数列表)---method overloading(方法的重载)的ruby实现

method的可以有一个特殊的parameters---以星号开始,比如:

def test(*args)

  p args

end

test("one",1,3.14,(1..3))     # Arugment Lists

test(1,2,3)                          # Arugment Lists

结果:

["one", 1, 3.14, 1..3]

[1, 2, 3]

 

我们可以清楚的看见,args在这里是一个Array object

在定义methods的时候使用一个特殊的parameter,它以*为开始,这个parameter实际上是一个数组,在Arugment Lists中,第一个arugment放在数组的0位置,以此类推。在前面的文章中,也提到过这样的定义方式,为此还讨论了ruby中多态(polymorphism),重载(overloading),覆盖(overriding)的问题,在《多态(polymorphism),重载(overloading),覆盖(overriding)和ruby》一文中提到,ruby是没有overloading的,但是ruby可以使用不同的参数列表,比如File.open等很多很多的method,在这里,就详细描述了ruby中的实现,相比下ruby的这种实现方式会更加具有优越性。举例说明一下:

def add(*args)

  sum = 0

  args.each{|i| sum+=i}

  sum

end

p add(1,2,3)

假如通过重载,那么需要有无数个定义,因为arguments是不确定的。即使在arguments固定的情况下使用ruby的做法也是有一定的优势,我们知道重载要做的事情就是:1.确定parameters,并进行定义 2.对每一个不同的parameters的组合进行具体实现。ruby的做法使得1步骤不用做了,因为一个带星号的parameter就可以表示任何组合,代码更加简洁

 

 

 

术语补充:

arguments 实际使用method的时候的,写在method后面的都叫arguments
parameters 在method定义的时候,写在method后面的都叫parameters

可能在前面的文章中,并没有太多区分这2个术语(有些资料的确不区分),可能带来一些问题,如果疑问,请联系我

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
eigenclass - Changes in Ruby 1.9
Django中URL视图函数的一些高级概念介绍
InfoQ: 在Ruby中对字符串和block求解
*args and **kwargs in python explained | Python Tips
Python--函数传参
Python Tips, Tricks, and Hacks
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服