`
luoping0425
  • 浏览: 106294 次
  • 性别: Icon_minigender_2
  • 来自: 赣州
文章分类
社区版块
存档分类
最新评论

Ruby method 学习笔记

阅读更多
学习笔记,来自于Programming Ruby 1.9

Ruby 关于Method

一、 定义方法
使用关键字 def
方法名称以小写字母或下划线开头,后面跟着字母、数字和下划线
有的方法名后面跟着?,!或=
方法名有?通常意味着方法返回boolean型结果
例:
1.even? # => false
2.even? # => true
1.instance_of?(Fixnum) # => true


方法名后有!,则此方法的接收者将被修改
方法名后加=,通常意味着赋值

Ruby方法的参数可以设定默认值
def cool_dude(arg1="Miles", arg2="Coltrane", arg3="Roach")
"#{arg1}, #{arg2}, #{arg3}."
end
cool_dude # => "Miles, Coltrane, Roach."
cool_dude("Bart") # => "Bart, Coltrane, Roach."
cool_dude("Bart", "Elwood") # => "Bart, Elwood, Roach."
cool_dude("Bart", "Elwood", "Linus") # => "Bart, Elwood, Linus."

二、可变长度的参数
在参数前加*号,用以接收多个参数值或可变参数值
def varargs(arg1, *rest)
"arg1=#{arg1}. rest=#{rest.inspect}"
end

varargs("one") # => arg1=one. rest=[]
varargs("one", "two") # => arg1=one. rest=[two]
varargs "one", "two", "three" # => arg1=one. rest=[two, three]


使用*号表示一个在方法中不使用,但可能在父类中使用到的参数
class Child < Parent
  def do_something(*not_used)
    # our processing
    super
  end

end


这种情况下,可以不需要写参数名称,只使用*表示参数

class Child < Parent
  def do_something(*)
    # our processing
    super
  end
end


在Ruby1.9中,我们可以把此类参数放在任何位置,如:
def split_apart(first, *splat, last)
  puts "First: #{first.inspect}, splat: #{splat.inspect}, " +
    "last: #{last.inspect}"
end

split_apart(1,2)
split_apart(1,2,3)
split_apart(1,2,3,4)

produces:
First: 1, splat: [], last: 2
First: 1, splat: [2], last: 3
First: 1, splat: [2, 3], last: 4


三、方法和Block
在方法中使用block通常使用yield

def double(p1)
  yield(p1*2)
end

double(3) {|val| "I got #{val}" } # => "I got 6"
double("tom") {|val| "Then I got #{val}" } # => "Then I got tomtom"


然而,如果方法定义中的最后一个参数以&开头,则,所有相关的block都会转换为Proc对象。
class TaxCalculator
  def initialize(name, &block)
    @name, @block = name, block
  end

  def get_tax(amount)
    "#@name on #{amount} = #{ @block.call(amount) }"
  end
end

tc = TaxCalculator.new("Sales tax") {|amt| amt * 0.075 }
tc.get_tax(100) # => "Sales tax on 100 = 7.5"
tc.get_tax(250) # => "Sales tax on 250 = 18.75"


四、方法调用
方法的默认接收者为self
在一个类方法或module中的方法,接收者为类或module的名称

五、把参数传给一个方法
六、方法的返回值
每一个调用的方法都会有一个返回值。方法的返回值是最后一个语句执行的结果
def meth_one
  "one"
end

meth_one # => "one"

def meth_two(arg)
  case
  when arg > 0 then "positive"
  when arg < 0 then "negative"
  else "zero"
  end
end

meth_two(23) # => "positive"
meth_two(0) # => "zero"


Ruby有一个关于return 的语句
如果return多个值,则方法会返回一个数组
def meth_three
  100.times do |num|
    square = num*num
    return num, square if square > 1000
  end
end

meth_three # => [32, 1024]

num, square = meth_three
num # => 32
square # => 1024


七、Splat,将扩张集合到方法调用中
这个是Ruby1.9中的特性
之前我们看到在方法定义的参数中,在参数前加*,可以将多个参数值传给一个参数,
这里正好相反。
调用一个方法时,你可以把任意的集合或列举型对象转变成组合的元素,然后把这些元素传递给单独的参数了。在传递的数组参数前加上*。
def five(a, b, c, d, e)
  "I was passed #{a} #{b} #{c} #{d} #{e}"
end

five(1, 2, 3, 4, 5 ) # => "I was passed 1 2 3 4 5"
five(1, 2, 3, *['a', 'b']) # => "I was passed 1 2 3 a b"
five(*['a', 'b'], 1, 2, 3) # => "I was passed a b 1 2 3"
five(*(10..14)) # => "I was passed 10 11 12 13 14"
five(*[1,2], 3, *(4..5)) # => "I was passed 1 2 3 4 5"


八、让Blocks更加动态一些
如果方法的最后一个参数值有&,Ruby假定这是一个Proc对象,Ruby会把该Proc 对象转换为一个block,然后在方法中使用。
九、收集Hash变量
一般方法中,参数值对应一定的参数变量,传递参数就需要按照一定的顺序。
在Ruby中可以使用Hash的键值对,来传递参数。
class SongList
  def search(name, params)
    # ...
  end
end

list.search(:titles,
  { :genre => "jazz",
 :duration_less_than => 270
 })


此处,可以将Hash作为一个键=>值参数列表。
list.search(:titles,
  :genre => 'jazz',
  :duration_less_than => 270)


在Ruby1.9中,可以写成:
list.search(:titles, genre: 'jazz', duration_less_than: 270)

分享到:
评论

相关推荐

    ruby笔记1ruby笔记1ruby笔记1

    ruby笔记1ruby笔记1ruby笔记1ruby笔记1ruby笔记1ruby笔记1

    Ruby学习笔记

    这个暑假回家没事干闲...恩,废话就少提,下面我学习Ruby的各个部分。其中Ruby风格这一部分是开放的,因为我暂时还没有形成自己的风格。我用xmind来记笔记,因此我只是把笔记搬到博客上,看看下面的图。好有爱啊!!!

    ruby学习笔记

    ruby基础笔记,自学笔记,ruby基础语法非常全面ruby基础笔记,自学笔记,ruby基础语法非常全面

    Ruby学习笔记(学习心得)

    Ruby学习笔记 01 类的属性与方法 02 访问控制 03 Container(Array/Hash) 04 Iterator 05 简单数据类型 06 范围 07 方法 08 条件控制 09 异常处理

    ruby笔记3ruby笔记3ruby笔记3

    ruby笔记3ruby笔记3ruby笔记3ruby笔记3ruby笔记3ruby笔记3

    ruby笔记2ruby笔记2ruby笔记2

    ruby笔记2ruby笔记2ruby笔记2ruby笔记2ruby笔记2

    个人ruby学习笔记

    ruby学习笔记....................

    ruby初学笔记ruby初学笔记

    ruby初学笔记ruby初学笔记ruby初学笔记ruby初学笔记ruby初学笔记

    Ruby知识点笔记

    Ruby知识点笔记

    精华ruby学习笔记和代码

    这个笔记里包含了ruby的整型,字符串,浮点数,布尔等基础数据类型,还有数组,哈希hash的用法, 类的定义,函数方法,以及对象定义,其他高级用法解释,除了笔记记录的语法糖之外,还包含了一些解释性的代码,帮助...

    Ruby学习:关于Ruby的学习笔记

    我对Ruby的学习笔记 评论 #i'm a sinlg eline comment =begin I'm a multiline comment! =end 资料来源 puts(writeln) 控制台输出/打印的Ruby方式 puts "hello world" 编写问候世界并返回nil 打印(写) 字符...

    Redis全套学习笔记 (带章节目录) 完整版pdf

    本文是一篇关于Redis全套学习笔记的文章,主要介绍了Redis的基础知识、数据结构、持久化、集群、高可用、性能优化等方面的内容。通过本文的学习,读者可以全面掌握Redis的使用和应用,提高自己的技术水平和实践能力...

    Ruby基础学习资料

    Ruby基础学习资料:Ruby介绍,环境配置,Ruby语法。

    rubyinstaller-devkit-3.0.2-1-x64 and Ruby 学习笔记.7z

    rubyinstaller-devkit-3.0.2-1-x64 and Ruby 学习笔记.7z 由于国内访问github服务器不稳定,所以上传到CSDN给大家方便下载

    Ruby 魔法 学习笔记之一

    一、向对象显示的发送消息 我们可以向对象直接发送消息: Ruby代码 代码如下:class HelloWorld def say(name) print “Hello, “, name end end hw = HelloWorld.new hw.send(:say,”world”) 我们通常使用hw.say(...

    让你的Ubuntu 快速安装 Ruby on Rails 笔记

    让你的Ubuntu 快速安装 Ruby on Rails 笔记

    学习 Ruby 的笔记以及 Demo.zip

    学习 Ruby 的笔记以及 Demo.zip

    Ruby自学笔记

    Ruby自学笔记,这是我在学习Ruby时的小结笔记,若对你有所帮助请给满星,谢谢!!!

    《Java JDK6学习笔记》

    Java、JDK6、良葛、林信良、Java学习笔记 我没看到实体书,不知是否相同, 近些日学习一下ruby方面的,顺便看看java方面的, 这个是Java JDK6的学习笔记电子版, 压缩包里包含两个文件, 一个是chm格式(这个还行吧)...

Global site tag (gtag.js) - Google Analytics