`

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

    博客分类:
  • Ruby
 
阅读更多

Interactive Ruby(命令行交互)

ruby:输入后,ctrl+d(end-of-file character),即可执行

irb:是ruby提供的交互工具。

 

Ruby Documentation:RDoc and ri

RDoc与javadoc类似,用于导出source file中的API说明,导出的文件格式可以是HTML,也可以是ri格式。

ri:离线文档显示工具,比如ri GC或ri GC::enable。但在win下安装的runby环境中,上述命令没有对应的文档不输出,还需更多了解。

eg.

ri Array

ri Array.sort。

::用于类方法; #用与实例方法。

在线文档1 文档2

 

----------------------Ruby.new---------

Everything you manipulate is an object,and the results of those manipulations are themselves objects.

获取绝对值,java>num = Math.abs(num);ruby> num=-1234 positive=num.abc,即已经内置。

不需要使用semicolons(分号)分隔,只是使用换行;使用#作为注释开始,代码缩进采用两个字符的风格,变量不需要声明,使用的时候自被创建分配。

 

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是什么概念?

Local Variable: name   fish_and_chips   x_axis   thx1138   _x   _26
Instance Variable: @name   @point_1   @X   @_   @plan9
Class Variable: @@total   @@symtab   @@N   @@x_pos   @@SINGLE
Global Variable: $debug   $CUSTOMER   $_   $plan9   $Global
Class Name: String   ActiveRecord   MyClass
Constant Name: FEET_PER_MILE   DEBUG

----------Arrays and Hashes------------

Arrays与Hashes用来存储对象的集合,通过key来获取,arrays是通过整型,Hashes支持任何类型的key。它们都是根据需要自增长,array效率更高,hashes更灵活,两者都可以存储不同类型的对象。包括基础类型。

array:

a = [1, 'cat', 3.14]

puts "The first element is #{a[0]}"         //下标从0开始

 

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 zero
histogram['ruby']         //打印0
histogram['ruby'] = histogram['rbuy'] +1 //赋值
histogram['ruby']    //打印1

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

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

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

 

NORTH = 1;SOUTH = 2;WEST = 3;EAST = 4
if (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.now
if 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.downcase
end

 这面这个示例是为了说明: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 > 3000

square = 4
while square < 1000
  square = square*square
end
等同
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 = gets
if line =~ /Perl|Python/ #这只是一个匹配表达式,不表示把结果赋值给line
  puts "Script language menthioned : #{line}"
end
如果只是打印
puts line =~ /Perl|Python/ 则打印的是匹配的首位置
#Ruby的提供了用于字符串替换的方法
line = gets
newLine = line.sub(/Perl/, 'Ruby')  # Replace first Perl with Ruby
newLine = 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.socialize
end

 {}用于单行,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"
end
call_block {puts 'in the block'}

produces:
Start of metho
In the block
In the block
End 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')
end
who_says_what {|person, phrase| puts "#{person} says #{phrase}"}
produces:
Dave says hello
Andy says goodbye

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

 

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

使得方法们 猛烈的来一波

 

['bee', 'dog', 'cat'].each {|animal| print animal, '  '}
5.times {print '*'}
3.upto(6) {|i| print i}
('a'..'e').each {|char| print char}
puts
produces:
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 line
end

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

定义文件:cmd_line.rb

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

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

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Programming Ruby(读书笔记)-3章

    《Programming Ruby》是一本关于Ruby编程语言的经典书籍,它的第三章深入探讨了Ruby的基本语法和核心概念。在这一章中,作者介绍了变量、常量、符号、数组、哈希等核心数据类型,以及控制流(条件语句和循环)和方法...

    Ruby学习资料(含参考手册和Programming Ruby)-中文.rar

    "ruby--.txt"可能是一个文本文件,其中包含了Ruby的代码示例、笔记或者问题解答,通过阅读可以加深对Ruby语法和实践的理解。 "Ruby语言入门教程附实例"和"ruby-mht"文件很可能是包含实例的教程,实践是学习编程的...

    ruby初学笔记ruby初学笔记

    1. **面向对象编程(Object-Oriented Programming, OOP)**:Ruby是完全的面向对象语言,每个值都是一个对象,包括基本类型如整数、字符串和布尔值。类是创建对象的蓝图,实例化一个类就能创建一个新的对象。理解类...

    Ruby 语言教程从小白到入门

    首先,Ruby的核心概念是面向对象编程(Object-Oriented Programming, OOP)。在Ruby中,一切都是对象,包括基本的数据类型如数字、字符串和布尔值。理解这一点至关重要,因为这意味着你可以对任何东西调用方法,这极...

    programming_language:编程语言学习笔记

    "programming_language:编程语言学习笔记"这一主题旨在整理和探讨各种编程语言的关键特性、语法结构以及在实际开发中的应用。 首先,编程语言可以分为几大类别,如低级语言(机器语言和汇编语言)和高级语言(如C,...

    java俄罗斯方块源码-ossu-cs:通过开源社会大学开设的计算机科学课程

    java俄罗斯框源码开源社会大学 计算机科学课程 罗伯特·福克 核心模块 C100 - 计算机科学课程简介 涵盖的主题: computation imperative programming ...笔记 ...programming ...Ruby 代码 班级 笔记 代码 地

    java版中国象棋源码-learning:学习笔记

    Ruby, Algorithms, and so on in a few days or hours. The Amazon advanced search for [ and found 512 such books. Of the top ten, nine are programming books (the other is about bookkeeping). Similar ...

    rxswift-to-combine-cheatsheet:RxSwift到Apple的合并备忘单

    笔记 任何观察者 任何订阅者 行为继电器 :cross_mark: 围绕BehaviorSubject的简单包装,可以在Combine中轻松地重新创建 行为主体 CurrentValueSubject 这似乎是隐藏@State的类型 可完成的 :cross_mark: 复合一...

    zellytozelly

    2. **Web框架**:为了提高开发效率,后端开发者通常会使用Web框架,如Spring Boot(Java)、Django或Flask(Python)、Express(Node.js)、Ruby on Rails(Ruby)或Gin(Go)。这些框架提供了丰富的功能,用于构建...

    BackendRoadmap

    1. **基础语言和框架**:后端开发通常始于学习一种或多种编程语言,如Python、Java、Ruby或Node.js。每种语言都有其特性和用途,例如Python适合数据分析和快速开发,而Java则因其跨平台能力和企业级应用而流行。 2....

    xjl_fullstack:前端 全栈学习

    "xjl_fullstack:前端 全栈学习" 的标题和描述表明这是一个关于前端和全栈开发的学习资源,可能是某个教程、笔记或者代码仓库。尽管没有提供具体的压缩包内容,我们可以根据标签"HTML"以及文件名"xjl_fullstack-main...

Global site tag (gtag.js) - Google Analytics