首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Programming Ruby(读书笔记)-一~2章

2014-01-03 
Programming Ruby(读书笔记)-1~2章puts say_goodnight(name) puts(say_goodnight(name))?-------?

Programming Ruby(读书笔记)-1~2章
puts say_goodnight("name") == puts(say_goodnight("name"))?-------

?

创建字符串对象主要的两种方式:使用单引号,使用双引号。两者的差别是在ruby构造字符串对象是,单引号样式的会做更少,并且更少的异常,它只把输入的字符连接成串,而双引号样式需要做更多工作,第一,它要先查找是否有斜杠标识的替换符,如果有则替换它们为二进制的值,比如:

puts "And good night,\nGrandma"

打印:

And good night,

Grandma。

第二,ruby要解析串中的表达式,如#{name},同样需要进行值替换。

所以,如果字符串中没有需要转义的字符,或者没有需要替换的变量值,最好使用单引号括起来,以提高性能,是这样的吧?

?

say_goodnight方法还可以更简化,return返回的是块中最后一句的值,所以,可以去掉中间的赋值操作,如下:

def say_goodnight(name)  "Good night #{name}"end

?puts say_goodnight('pa')打印的结果与更早前的一样。

--------------

Ruby的命名约定主要通过名称的前缀来标识:Local variables,method parameters,method names首字母小写或下划线;Global variables前缀$,instance variables前缀@,Class variables前缀@@,class names,module names,constants(常量全大写)首字母大写。

在上述约定的基础上,可使用字母、数字、下划线,但注意@后面不能是数字。

名称含多个单词时,instance variables用下划线,Class name使用MixedCase(每个单词首字母大写)

样例如下表:(Class variable与Global variable是什么概念?)

?

a[2] = nil

puts "The array is now #{a.inspect}"

=>The array is now [1, "cat", nil]

注意:Ruby中的nil不同于其它语言的null,在此它同样表示一个对象,与其它对象一样,只是它用来表示nothing。

创建数组会因引号和逗号而麻烦,可以使用%w来简化这个操作,比如上面的示例也可以写成:

?

a = %w{cat bee dog elk}puts a[0]

hash

与array不同的是,使用花括号{}来包含,array中方括号[]包含。并且每个元素是键值对的形式,中间使用=>来衔接,比如:

?

inst_section = {  'cello' =>'string',  'oboe' => 'brass'}

?key必需唯一(不唯一 会覆盖)。

p inst_section['cello'] ? ? ? ? //p与puts类似,只是p会打印nil对象为nil,而puts则不打印。

对于不存在的key,默认返回nil,nil在条件表达式中即false。但是一些时候,我们希望它返回是0这种数值,比如,程序是计算单词在文章中出现的次数。则可使用下面的方式:使用Hash.new(0)

?

histogram = Hash.new(0)  //The default value is zerohistogram['ruby']         //打印0histogram['ruby'] = histogram['rbuy'] +1 //赋值histogram['ruby']    //打印1

?array与hash有很多有用的方法。

--------Symbols(标记)---

Java中,我们会使用这样代码用于这样的场景:

?

NORTH = 1;SOUTH = 2;WEST = 3;EAST = 4if (direction == NORTH)....

Ruby中则不需要先定义,可直接使用

?

if direction == :north  #...end

标识串以:作为前缀。There's no need to assign some kind of value to a symbol-Ruby take care of that for you.Ruby also guarantees that nomatter where it appears in your program,a particular symbol will have the some value.

标识在hash中常作为key使用,比如:

?

inst_section = {  :cello => 'string'}puts "An oboe is #{inst_section[:cello]} instrument"

?为此,Ruby提供一种更简化的方式:

?

inst_section = {cello: 'string'}puts "oboe is #{inst_section[:cello]} instrument"

?注意:使用key时,一定要:cello而不能cello或cello:

--------control structures控制结构----------

?

today = Time.nowif today.saturday?  puts "Do chores around the house"elsif today.sunday?  puts "Relax"else  puts "Go to work"end

?没有大括号,没有分号,只有end,同样while也是以end结束。

?

?

while line = gets        //gets是从标准输入中获取内容,赋给line,nil被认为                                          //false,则可终止while  puts line.downcaseend

?这面这个示例是为了说明:Most statements in Ruby return a value,which means you can use them as conditions.

如果if or while只是一句表达式,则可以使用Ruby的statement modifiers作为快捷方式,比如:

?

if radiation > 3000  puts "Danger, Will Robinson"end等同puts "Danger, Will Robinson" if radiation > 3000square = 4while square < 1000  square = square*squareend等同square = square*square while square < 1000

?-----------Regular Expressions-----------

Ruby中/pattern/表示正则表达式,它本身也是对象,即可作为对象处理。

/Perl|Python/字符串中包含Perl或Python。

/\d\d:\d\d:\d\d/ # a time such as 12:34:56

/Perl.*Python/ # Perl, zero or more other chars, then Python

/Perl Python/ # Perl, a space, and Python

/Perl *Python/ # Perl, zero or more spaces, and Python

/Perl +Python/ # Perl, one or more spaces, and Python

/Perl\s+Python/ # Perl, whitespace characters, then Python

?

/Ruby (Perl|Python)/ # Ruby, a space, and either Perl or Python

正则式的使用

使用:=~ ?'abc' =~ /a*b*c+/

结果要么是匹配的首位置,要么是nil,所以,也可以把匹配表达式用于if等条件判断,比如:

?

line = getsif line =~ /Perl|Python/ #这只是一个匹配表达式,不表示把结果赋值给line  puts "Script language menthioned : #{line}"end如果只是打印puts line =~ /Perl|Python/ 则打印的是匹配的首位置#Ruby的提供了用于字符串替换的方法line = getsnewLine = line.sub(/Perl/, 'Ruby')  # Replace first Perl with RubynewLine = line.gsub(/Python/, 'Ruby') # Replace every Python with Ruby

?------Blocks and Iterators 块与迭代器------------

代码块可分配给方法调用,就像它们是参数一样。使用代码块实现callback(比JAVA的内部类更简单),to pass around chunks of code,或者实现迭代器。

代码块的定义:使用花括号包括或使用do与end包括。

?

{puts 'Hello'}或do  club.enroll(person)  person.socializeend

?{}用于单行,do end用于多行

使用代码块

将代码块关联一个调用方法,you do this by putting the start of the block at the end of the source line containing the method call.将代码块放在包含了方法调用的行的后面。

?

greet {puts 'Hi'}varbose_greet("Dave", "loyal customer") {puts 'Hi'}

?然后方法就可以调用一次或多次代码块了,通过使用yield。you can think of yield as being something like a method call that invokes the block associated with the call to the method containing the yield.

?

def call_block  puts "Start of method"  yield  yield  puts "End of method"endcall_block {puts 'in the block'}produces:Start of methoIn the blockIn the blockEnd of method

?块中的代码执行两次,一次yield调用一次。

Some people like to think of the association of a block with a method as a kind of argument passing.This works on one level,but it isn't really the whole story.You may be better off thinking of the block and the method as coroutines,whick transfer control backand forth between themselves.

可以调用时传入参数给代码块。在代码块中使用|params,....|列出来接入参数的名称。

?

def who_says_what  yield('Dave', 'hello')  yield('Andy', 'goodbye')endwho_says_what {|person, phrase| puts "#{person} says #{phrase}"}produces:Dave says helloAndy says goodbye

?代码块在贯穿整个Ruby包用于实现iterators(迭代器)-用于从集合中获取successive(连续的)元素的方法。

?

animals = %w{ant bee cat dog}animals.each {|animal| puts animal}produces:antbeecat dog

使得方法们 猛烈的来一波

?

['bee', 'dog', 'cat'].each {|animal| print animal, '  '}5.times {print '*'}3.upto(6) {|i| print i}('a'..'e').each {|char| print char}putsproduces:cat dog horse *****3456abcde#5与3都是对象,print打印没有换行

----------Reading and Writing---------------

?

printf("Number:%5.2f,\nString:%s\n", 1.23, 'hello')produces:Number: 1.23,String: hello

?gets puts print都是输入输出的方法,但是下面的不知道怎么样才能使gets返回的是nil

?

while line = gets  print lineend

?---------命令行参数--------

定义文件:cmd_line.rb

puts "You gave #{ARGV.size} arguments"p ARGV produces:You gave 4 arguments["ant", "bee", "cat", "dog"]

?-------------------------------------------------Onward and Upward--步步高升------------------------

?

?

?

?

?

?

?

?

?

热点排行