Dav*_*hme 23 ruby metaprogramming
在Ruby中:
for i in A do
# some code
end
Run Code Online (Sandbox Code Playgroud)
是相同的:
A.each do |i|
# some code
end
Run Code Online (Sandbox Code Playgroud)
for
不是内核方法:
for
红宝石究竟是什么" "就像是:
total = sum i in I {x[i]}
Run Code Online (Sandbox Code Playgroud)
映射到:
total = I.sum {|i] x[i]}
Run Code Online (Sandbox Code Playgroud)
Fir*_*aad 46
这几乎是语法糖.一个区别是,虽然for
会使用围绕它的代码范围,但each
在其块内创建一个单独的范围.比较以下内容:
for i in (1..3)
x = i
end
p x # => 3
Run Code Online (Sandbox Code Playgroud)
与
(1..3).each do |i|
x = i
end
p x # => undefined local variable or method `x' for main:Object
Run Code Online (Sandbox Code Playgroud)
Jer*_*ten 14
for
只是该each
方法的语法糖.通过运行此代码可以看到:
for i in 1 do
end
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
NoMethodError: undefined method `each' for 1:Fixnum
Run Code Online (Sandbox Code Playgroud)
因为只是语法糖.
从镐:
因为...... In
之前我们说只有内置的Ruby循环原语是while和until.那么什么是"为了"的东西呢?好吧,因为几乎是一堆语法糖.当你写作
Run Code Online (Sandbox Code Playgroud)for aSong in songList aSong.play end
Ruby将其转换为:
Run Code Online (Sandbox Code Playgroud)songList.each do |aSong| aSong.play end
for循环和每个表单之间的唯一区别是正文中定义的局部变量的范围.这将在第87页讨论.
您可以使用for来遍历响应每个方法的任何对象,例如Array或Range.
Run Code Online (Sandbox Code Playgroud)for i in ['fee', 'fi', 'fo', 'fum'] print i, " " end for i in 1..3 print i, " " end for i in File.open("ordinal").find_all { |l| l =~ /d$/} print i.chomp, " " end
生产:
Run Code Online (Sandbox Code Playgroud)fee fi fo fum 1 2 3 second third
只要您的类定义了合理的每个方法,您就可以使用for循环来遍历它.
Run Code Online (Sandbox Code Playgroud)class Periods def each yield "Classical" yield "Jazz" yield "Rock" end end periods = Periods.new for genre in periods print genre, " " end
生产:
Run Code Online (Sandbox Code Playgroud)Classical Jazz Rock
Ruby没有列表推导的其他关键字(就像你上面提到的总和例子). for
不是一个非常受欢迎的关键字,方法syntax(arr.each {}
)通常是首选.
归档时间: |
|
查看次数: |
7769 次 |
最近记录: |