《Programming Ruby 第二章 Ruby.new》学习笔记

2.1 Ruby是一门面向对象语言

Ruby是真正的面向对象语言。
类是状态和使用这些状态的方法的组合。
对象 = 类的实体
在Ruby中,通过调用构造函数来创建对象,这是一种与类相关联的特殊方法。标准的构造函数是new

每个对象有一个唯一的对象标识符(Object ID)。
方法是通过向对象发送消息来唤起调用的。

C:\Users\John>irb
irb(main):001:0> "gin joint".length
=> 9
irb(main):002:0> "Rick".index("c")
=> 2
irb(main):003:0> -1945.abs
=> 1945

2.2 Ruby的一些基础知识

def say_goodnight(name)
    result = "Good night, " + name
    return result
end
# time for bed...
puts say_goodnight("John-Boy")
puts say_goodnight "Mary-Ellen"

运行结果:

E:\cloud\code\ruby>ruby method.rb
Good night, John-Boy
Good night, Mary-Ellen

只要每条语句放在单独的行上,就不需要在语句结束处加上分号。
Ruby注释以一个#字符开始,在行尾结束。
puts的功能就是输出其参数,后面跟一个回车换行符。

字符串字面量

irb(main):023:0> puts "And good night,\nGranma"
And good night,
Granma
=> nil

双引号字符串:字符串内的表达式内插(expression interpolation),#{表达式}序列会被"表达式"的值替换。

def say_goodnight(name)
    result = "Good night, #{name}"
    return result
end
puts say_goodnight('Pa')

#输出结果
#Good night, Pa
def say_goodnight(name)
    result = "Good night, #{name.capitalize}"
    return result
end
puts say_goodnight('uncle')

#输出结果
#Good night, Uncle

如果表达式只是一个全局变量或类变量,则不需要提供花括号。

$greeting = "Hello" # $greeting是全部变量
@name = "Prudence"  # @name是实例变量
puts "#$greeting,#@name"

Ruby方法所返回的值,是最后一个被求值的表达式的值。

def say_goodnight(name)
    "Good night, #{name}"
end
puts say_goodnight('Ma')

Ruby使用一种命令惯例来区分名称的用途:名称的第一个字符显示这个名称如何被使用。
局部变量、方法参数、方法名称:小写字母或下划线
全局变量:$
实例变量:@
类变量:@@
类名、模块名、常量都必须以一个大写字母开始。


变量和类名称样例

包含多个单词的实例变量名称在词与词之间使用下划线连接,包含多个单词的类变量名称使用混合大小写(每个单词首字母大写)。

2.3 数组和散列表

irb(main):001:0> a = [1, 'cat', 3.14] #有三个元素的数组
=> [1, "cat", 3.14]
#访问第一个元素
irb(main):002:0> a[0]
=> 1
irb(main):003:0> a[2]
=> 3.14
#设置第三个元素
irb(main):004:0> a[2] = nil
=> nil
# 显示这个数组
irb(main):005:0> a
=> [1, "cat", nil]

nil是一个对象,与别的对象一样,只不过它是用来表示没有任何东西的对象。

irb(main):009:0> a  = ['ant', 'bee', 'cat', 'dog', 'elk']
=> ["ant", "bee", "cat", "dog", "elk"]
irb(main):010:0> a[0]
=> "ant"
irb(main):011:0> a[3]
=> "dog"
irb(main):012:0> a = %w{ant bee cat dog elk}
=> ["ant", "bee", "cat", "dog", "elk"]
irb(main):013:0> a
=> ["ant", "bee", "cat", "dog", "elk"]
inst_section = {
    'cello' => 'string',
    'clarinet' => 'woodwind',
    'drum' => 'percussion',
    'oboe' => 'woodwind',
    'trumpet' => 'brass',
    'violin' => 'string'
}
puts inst_section['oboe']
puts inst_section['cello']
puts inst_section['bassoon']

在条件表达式中nil意味着false

irb(main):001:0> histogram = Hash.new(0)
=> {}
irb(main):002:0> histogram['key1']
=> 0
irb(main):003:0> histogram['key1'] = histogram['key1'] + 2
=> 2
irb(main):004:0> histogram['key1']
=> 2

2.4 控制结果

Ruby是使用end关键字来表明程序体的结束。

count = 1
tries = 2
if count > 10
    puts "Try again"
elsif tries == 3
    puts "You lose"
else
    puts "Enter a number"
end
weight =0
num_pallets = 10
while weight < 100 and num_pallets <= 30
    weight +=  rand(50)
    num_pallets += 1
    puts "weight:#{weight},num_pallets:#{num_pallets}"
end

大多数Ruby语句会返回值,这意味着可以把它们当条件使用。

gets方法从标准输入流返回下一行。

while line = gets
    puts line.downcase
end

如果ifwhile语句的程序体只是一个表达式,Ruby的语句修饰符是一种有用的快捷方式。只要写出表达式,后面跟着ifwhile和条件。

radiation = 3001
if radiation > 3000
    puts "Danger, Will Robinson"
end
radiation = 3001
puts "Danger, Will Robinson" if radiation > 3000
square = 2
while square < 1000
    square = square * square
end
puts square
square = 2
square = square * square while square < 1000
puts square

2.5 正则表达式

在Ruby中,通常在斜线之间(/pattern/)编写模式(pattern)来创建正则表达式。
正则表达式是对象并且可以当做对象来操作。

irb(main):004:0> /Perl|Python/=~ 'python Perl'
=> 7
irb(main):005:0> /P(erl|ython)/=~ 'python Perl'
=> 7
irb(main):009:0> /ab+c/ =~ '123456abbc'
=> 6
irb(main):010:0> /ab+c/ =~ '123456abc'
=> 6
irb(main):011:0> /ab*c/ =~ '123456abc'
=> 6
irb(main):012:0> /ab*c/ =~ '123456ac'
=> 6

=~如果在字符串中发现了模式,返回模式的开始位置,否则返回nil,这意味着可以在ifwhile语句中把正则表达式当做条件使用。

line = 'this is Perl.'
if line =~ /Perl|Python/
    puts "Scripting language mentioned: #{line}"
end
line = 'This is Ruby,but I want to learn Python.I love Python because google uses Python.'
puts line.sub(/Python/, 'Ruby')  #用'Ruby'替换第一个'Python'
puts line.gsub(/Python/, 'Ruby') # 用'Ruby'替换所有的'Python'

puts line.gsub(/Ruby|Python/, 'Perl')

2.6 Block和迭代器

Block一种可以和方法调用相关联的代码块。
Block只是在花括号或者do...end之间的一组代码。

{ puts "Hello"} # this is a block
do 
    puts "Hello"   # this is a block
end

单行block用花括号,多行block用do/end。
一旦创建了block,就可以与方法的调用相关联。把block的开始放在含有方法调用的源码行的结尾处,就可以实现关联。
如果方法有参数,它们出现在block之前。
使用Ruby的yield语句,方法可以一次或多次地调用相关联的block。可以把yield想象成方法调用。

def call_block
    puts "Start of method"
    yield
    yield
    puts "End of method"
end

call_block { puts "In the block" }
def call_block
    puts "Start of method"
    yield('hello', 99)
    yield('world', 10)
    puts "End of method"
end

call_block { |str, num| puts "In the block #{str},#{num}" }
animals = %w(ant bee cat dog elk) # 创建一个数组
animals.each {|animal| puts animal} # 迭代它的内容
['cat', 'dog', 'horse'].each{|name| print name, " "}
5.times { print "*" }
3.upto(6) { |i| print i }
('a'..'e').each { |char| print char }

其实我挺不喜欢Ruby这样对待block的方式。

2.7 读/写文件

puts输出它的参数,并在每个参数后面添加回车换行符。
print输出它的参数,但没有添加回车换行符。

irb(main):001:0> printf("Number: %5.2f,\nString: %s\n", 1.23, "hello")
Number:  1.23,
String: hello
=> nil

gets获取用户的输入

line = gets
print line

早期:gets方法有副作用:它返回刚读取的这行数据的同时,也把这行保存到$_变量中。如果不带任何参数地调用print,它会打印出$_中的内容。如果用正则表达式作为条件编写ifwhile语句,正则表达式会与$_匹配。

while gets
    if /Ruby/
        print
    end
end

还是可以运行,不过有警告:

method.rb:2: warning: regex literal in condition

"Ruby风格"会使用迭代器和预定义的对象ARGF,ARGF表示程序的输入文件。

ARGF.each {|line| print line if line =~ /Ruby/}

2.8 更高更远

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容