Eloquent Ruby (Chapter 3) 手记

1. Literal Shortcuts

Array和Hash可以用方便的字面量结构来定义:

poem_words = %w {twinkle  little star how i wonder}

或括号:

poem_words = %w (twinkle  little star how i wonder)

Hash在Ruby1.9之后,有更方便的写法:

book_info = {first_name: ‘Russ’, last_name: ‘Olsen’}

2. Instant Arrays and Hashes from Method Calls

当给方法传多个参数的时候,使用星号*标记,来把参数包装为一个数组。例如:

def add_authors( *names )
  @author + " #{names.join(' ')}"
end

Hash也类似,

def load_font( specification_hash )
  # Load a font according to specification_hash[:name] etc.
end

可以给这个方法传任意参数:

load_font( :name > 'times roman', :size > 12 )

还可以更进一步, 去掉括号,这样看起来更像是命令,而不像方法调用。

load_font :name > 'times roman', :size > 12

3. Running Through Your Collection

def index_for( word )
  words.find_index { |this_word| word = this_word }
end

map, inject 方法。

4. Beware the Bang!

当心带叹号的方法。 还有push, pop, delete, 和shiftunshift也会改变数组自身。

5. Rely on the Order of Your Hashes

在Ruby1.9中, Array和Hash都是有序的。当你创建了一个新的hash:

hey_its_ordered = { first: 'mama', second: 'papa', third: 'baby' }

然后:

hey_its_ordered.each { |entry| pp entry }
#会输出:
[:first, "mama"]
[:second, "papa"]
[:third, "baby"]

6. Staying Out of Trouble

array = [ 0, -10, -9, 5, 9 ]
array.each_index {|i| array.delete_at(i) if array[i] < 0}
pp array

这段代码会输出:

[0, -9, 5, 9]

为什么呢? 因为当删除-10的时候,数组的内部索引被弄乱了,所以把-9漏掉了。 这种问题在上个例子中可能容易发现, 但是,情况并不是总是如此, 特别是当你在不同的线程中共享一个集合的时候, 危险在于, 一个线程正在修改被另一些线程迭代的集合。 如果需要不重复的集合,我们需要考虑一下Set.

require ‘set’

但是,需要注意, Set又是无序的。

最近的文章

ruby RegExp

Ruby对正则表达式支持非常好,所以对我经常使用到的做一个总结,包括Ruby中正则的写法,匹配的方法,替换,分组匹配等。1.Ruby中正则表达式的写法主要有三种 在//之间,要进行转义 在%r{}内,不用进行转义 Regexp.new()内,不用进行转义/mm\/dd/,Regexp.new(“mm/dd”),%r{mm/dd}三者效果相同,实质都是新建了一个Regexp的类。2.匹配的两种方法=~肯定匹配, !~否定匹配。=~表达式返回匹配到的位置索引,失败返回nil,符号左右内容...…

继续阅读
更早的文章

Eloquent Ruby (Chapter 2) 手记

1. If, Unless, While, and Until基于unless的语句有2个好处: 第一, 它比if not要短。第二, 一旦你习惯用它, 你可以轻松的去理解它。前提是你需要熟悉它,如果不熟悉, 你就像穿错了鞋。 但是对于大多数的程序员来说, 已经习惯于unless。2. Use the Modifier Forms Where Appropriate你可以使用:@title = new_title unless @read_only也可以使用@title = new_t...…

继续阅读