因为是搞前端出生的,学 ruby 的时候最大感受是内建的方法非常好用,大部分简单的操作都可以一行搞定。不过也因为内建方法比较多,所以很多都是用的时候才查的,目前还不是很熟。时不时看都别人的代码,才发现自己之前写的代码里很多用内建的方法就可以很轻易的搞定,于是每次修改时都可以 delete 一大段代码...下面举几个例子,希望大家也能贴一贴,相信这类资料应该还是很有用的。
File.join("lib/","ruby","gem.rb")
#=> bin/ruby/gem.rb
# 好处是不用处理斜杠了
def print_args(a)
Array(a).each {|i| print i}
end
print_args [1,2,3] #=> 123
print_args 1 #=> 1
# 定义灵活的方法参数时经常用到
%w(a b c).map &:upcase
#=> ["A", "B", "C"]
# 可用于代替简单的代码块
ary = ["a",1,"b",2]
Hash[*ary] #=> {"a"=>1, "b"=>2}
将 Array 按顺序转换为 Hash 的键值
写 Ruby 代码必用
class Object
# returns instance methods of current object's class and its singleton methods
def lm # abbr of local methods
self.methods.sort - self.class.superclass.instance_methods
end
end
选取位置是 3 倍数的字母
Array("a".."z").select.with_index {|x,i| i%3 == 2}
#=> ["c", "f", "i", "l", "o", "r", "u", "x"]
irb 中不打印返回值
conf.echo = false
在 Dir.glob 中匹配方括号
Dir.glob('[\[]ruby[\]]') #=> "[ruby]"
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb
An object is blank if it's false, empty, or a whitespace string.
是包含关系:-)
zip 是可以接受 block 的,不需要 each...
[1,2,3].zip([4,5,6], [7,8,9]){|x| p x}
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
%W是可以内插的~
item = 123
=> 123
ree-1.8.7-2011.03 :023 > %W(1 2 3 4 #{item})
=> ["1", "2", "3", "4", "123"]
"abc\n\n".scan /./m
=> ["a", "b", "c", "\n", "\n"]
这个本来觉得很正常。。。直到我见到 javascript 的正则
#28 楼 @LinuxGit result ||= a 应该等效于 result = result || a,不等效于 result = a if result.nil?
r = 123
p [(r ||= '123')] #=> [123]
p [(r = r || '123')] #=> [123]
p [(r = '123' if r.nil?)] #=> [nil]
看看返回值的结果是不同的。
实际上||=也不完全等同于拆开的=和||
A = 123
A ||= 456 # 无警告信息
而
A = 123
A = A || 456 # warning: already initialized constant A
||= 是经过优化的特殊运算符
ActiveSupport 里的:
数组分组
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
a.in_groups_of(2)
# => [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, nil]]
a.in_groups(2)
# => [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, nil]]
```
矩阵~~转制~~转置
````ruby
b = a.in_groups(2)
# => [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, nil]]
> b.transpose
# => [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, nil]]
```````
#23 楼 @ery 很早的一篇文章供参考 一段 Ruby 代码的解释 。这是 Symbol#to_proc
方法,新版本的 rails 没有定义这个,可能是其他包里有。
["ruby","on","rails"] * " "
#37 楼 @zhangyuan Symbol#to_proc 的行为更像 lambda,参数处理不够灵活。试着在 String 上用 Proc 定义了一个 to_proc 方法
class String
def to_proc
Proc.new { |o, *args| o.send(self.to_sym, *args)}
end
end
ary = [1, 2, 3].zip([3, 2, 1])
p ary.map(&:+)
# => in `+': wrong number of arguments(0 for 1) (ArgumentError)
p ary.map(&'+')
# =>[4, 4, 4]
也可以定义一个 to_proc 类方法 :)
class Hello
def self.to_proc
lambda { |w| new(w).say }
end
def initialize(word)
@word = word
end
def say
puts "Hello #{@word}!"
end
end
%w(LZ LS LX).each(&Hello)
# =>
# Hello LZ!
# Hello LS!
# Hello LX!
"abc\n\n".scan /./m
=> ["a", "b", "c", "\n", "\n"]
放着 to_a 或 spilt 不用,用 scan, 这真有点大才小用了啊,而且用 scan 性能肯定差好多了。
"abc\n\n".chars.to_a
"abc\n\n".split("")