8.1 方法定义
def methodName(首字母小写/下划线)。若使用了大写,在调用的时候,ruby会认为这个一个常量,而不是一个方法,就会出现错误。
方法后可以跟? ! =。如果方法返回是boolean,则代?
1.even? #=>false 2.even? #=>true 1.instance_of(Fixnum) #=>true
如果方法会修改接收者(object.method,那object就是这个方法的接受者),或者方法的操作有危险性,使用!。比如String有chop与chop!,前者返回一个修改COPY,后者直接修改当前string。
如果以=结尾(suffix)用以表示给=左边赋值。
入参
入参可设默认值,使用arg=expression,当调用者没有显示的设时使用该默认值,expression可以引用前面的入参。
#示例演示第二个参数引用第一个参数 #string * 整数,表示string复制整数个。 def surround(word, pad_width=word.length/2) "[" * pad_width + word + "]" * pad_width end surround("elephant") #=>"[[[[elephant]]]]" surround("fox") # => "[fox]" surround("fox", 10) # => "[[[[[[[[[[fox]]]]]]]]]]返回值
ruby返回方法第后一行的执行结果,或者显示的return。
变长的参数列表
变化参数使用*作前缀。不要求放在最后一个位置。变长参数只允许有一个。
#分配给变长参数的是一个数组 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"]
变长参数常用来表示参数可输可不输。在调用父方法时,对这种参数的传递需要注意。
#调用父方法传变长参数,使用super就可以,表示有就传,没有就不传 class Child < Parent def do_something(*not_used) #our processing super end end #对于这种情况,*not_used直接使用*就可以了。
变长参数可放在任意参数的位置:
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
上面还可以直接写成:
#直接使用* def split_apart(first, *, last)
变长参数:不允许多个,不可以使用默认值。
方法,块
方法内使用yield(args)调用传入的块。
如果最后一个参数使用&(ampersand)标注,则表示这个参数接收块,并会被转换为一个Proc对象,
class TaxCalculator def initialize(name, &block) @name, @block = name, block #这种赋值方式,有意思 end def get_tax(amount) puts "#@name on #{amount} = #{ @block.call(amount)}" # 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"
8.2 Calling a Method(方法调用)
调用一个方法,可指定也可以不指定接收者(object.method=object就是接收者)。
connection.download_mp3("jitterbug") {|p| show_process(p)}
#connection是接收者。
当方法被调用时,Ruby首先将self设给接收者,然后调用接收者的该方法。
如果方法是类方法或者模块方法,则接收者就是类名或模块名。
Passing Parameters to a Method
Method Return Values
每个方法都有返回值,
#这个示例倒可以看看case when else end 语法 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可以是一外语句块。也常用于循环时跳出
#方法可以返回多个值 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_threee
Splat!Expanding Collections in Methond Calls
#参数可以由集合或者可迭代对象转换而来 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" 注意,参数个数一定要对应的上,如果调用时多了或少了,都会抛出错误
Making Blocks More Dynamic
print "(t)imes or (p)lus"
operator = gets
print "number:"
number = Integer(gets)
if operator = ~ /^t/
calc = lambda {|n| n*number}
else
calc = lambda {|n| n+number}
puts((1..10).collect(&calc).join(", "))
produces:
(t)imes or (p)lus: t
number: 2
2, 4, 6, 8, 10, 12, 14, 16, 18, 20
#如果方法参数的最后一个使用&作为前缀,ruby认为它是一个Proc对象,会把它从参数列表中删除,并转为一个块代码供内部调用。
#这里不明白(1..10).collect方法的语
Hash及关键字参数
#:titles表示希望返回的内容,第二个参数是参数hash class SongList def search(field, params) # ... end end list = SongList.new list.search(:titles, { genre: "jazz", duration_less_than: 270 }) 有一个快捷的写法: list.search(:titles, genre: "jazz", duration_less_than: 270) ruby会自动把它们组装为一个hash传给方法。
Keyword Argument Lists
#下面这个方法需要判断入参的hash中是否有其它非法参数
def search(field, options)
options = { duration: 120 }.merge(options)
if options.has_key?(:duration)
duration = options[:duration]
options.delete(:duration)
end
if options.has_key?(:genre)
genre = options[:genre]
options.delete(:genre)
end
fail "Invalid options: #{options.keys.join(', ')}" unless options.empty?
#如果options不为空,则表示有非法的参数,就失败
# rest of method
end
#在Ruby 2中,可以在方法中定义关键字参数,然后Ruby会自动将值设给对应的参数。
并且会进行参数校验
--------------------这些是2.0的语法-----------------------
结束。
相关推荐
《Programming Ruby》是一本关于Ruby编程语言的经典书籍,它的第三章深入探讨了Ruby的基本语法和核心概念。在这一章中,作者介绍了变量、常量、符号、数组、哈希等核心数据类型,以及控制流(条件语句和循环)和方法...
《Programming Ruby - The Pragmatic Programmer's Guide》第二版(2005年注释版)是一本在IT行业中享有盛誉的经典书籍,专门针对Ruby编程语言进行了深入浅出的讲解。该书不仅覆盖了Ruby语言的基础知识,还探讨了其...
《Programming Ruby 1.9》是一本经典的Ruby编程语言教程,其源代码包含了大量实例和示例,旨在帮助读者深入理解Ruby的语法、特性以及编程实践。这些源代码是学习和探索Ruby语言的重要资源,涵盖了从基础语法到高级...
"ruby--.txt"可能是一个文本文件,其中包含了Ruby的代码示例、笔记或者问题解答,通过阅读可以加深对Ruby语法和实践的理解。 "Ruby语言入门教程附实例"和"ruby-mht"文件很可能是包含实例的教程,实践是学习编程的...
《Programming Ruby》是一本关于Ruby编程语言的经典著作,由Dave Thomas、Andy Hunt和Chad Fowler合著。这本书自2004年初版以来,一直是学习Ruby的首选资源,被誉为“Pickaxe”书,因其封面的图标而得名。Ruby是一种...
《Programming Ruby》被誉为是学习Ruby语言的最佳指南,这本书在IT界享有极高的声誉,被亲切地称为“镐头书”,其价值与影响力无远弗届。本书不仅详细介绍了Ruby语言的核心概念、语法结构以及编程实践,还深入探讨了...
- **对象与属性**: 在Ruby中,一切皆为对象,每个对象都有自己的属性和方法。 - **类之间的交互**: 类可以通过继承和模块来扩展功能。 - **访问控制**: Ruby提供了public、private和protected等关键字来控制成员的...
《Programming Ruby》中文版第二版是一本专注于Ruby编程语言的经典教程。这本书的两个版本——高清扫描版和高清文字版,都是为了便于读者学习和查阅,其中都带有书签功能,帮助读者快速定位到相关内容。 Ruby是一种...
通过阅读《Programming Ruby 1.9 (3rd edition)》并研究提供的源码,开发者可以深入掌握Ruby 1.9的核心概念、设计模式以及最佳实践,从而提高编程效率和代码质量。这本书是Ruby开发者的必备参考资料,无论是初学者...
通过阅读《Programming Ruby》,读者不仅可以学习到Ruby的基本语法,还能深入了解其背后的哲学和设计思想,从而成为一名高效的Ruby开发者。书中的实例和练习将帮助你更好地掌握Ruby编程,提升解决问题的能力。
《Programming Ruby》是著名的Ruby语言教程,英文版的书籍旨在为全球开发者提供深入理解Ruby编程语言的途径。这本书详尽地介绍了Ruby的语法、特性、类库以及编程实践,是学习和进阶Ruby编程的宝贵资源。源代码的提供...
8. 对新一代Ruby语言的展望:第二版《Programming Ruby》被期待能够取代第一版,向世界展示Ruby语言的最新发展和成熟度。 9. 编程理念的启示:根据上述推荐和评价,可以理解到《Programming Ruby》不仅仅是关于语言...
通过阅读和运行这些代码,你可以深入了解Ruby如何处理类、对象、方法、模块、块、闭包等核心概念。此外,源代码还可能包含一些实用的库和工具,帮助开发者快速上手并构建实际应用。 Ruby语言的特色之一是它的元编程...
内含以下4个文档: 1、Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm 2、O'Reilly.Learning.Ruby.May.2007.chm 3、Programming Ruby 2e.pdf 4、ruby中文文档.chm
8. **YARV虚拟机优化**:Ruby 2.0继续使用YARV(Yet Another Ruby VM)作为其虚拟机,但进行了多方面的优化,提高了整体性能。 压缩包内的"ruby-2.0.0-p0"可能包含了完整的Ruby解释器、标准库、开发工具以及相关的...
PROGRAMMING+RUBY中文版 PROGRAMMING+RUBY中文版 PROGRAMMING+RUBY中文版