puts [1,2,3].map do |x|
x + 1
end.inspect
Run Code Online (Sandbox Code Playgroud)
随着ruby 1.9.2的回归
<Enumerator:0x0000010086be50>
Run Code Online (Sandbox Code Playgroud)
红宝石1.8.7:
# 1
# 2
# 3
Run Code Online (Sandbox Code Playgroud)
分配变量......
x = [1,2,3].map do |x|
x + 1
end.inspect
puts x
Run Code Online (Sandbox Code Playgroud)
[2,3,4]
小胡子块按预期工作:
puts [1,2,3].map { |x| x + 1 }.inspect
Run Code Online (Sandbox Code Playgroud)
[2,3,4]
如果我有课:
class KlassWithSecret
def initialize
@secret = 99
end
end
Run Code Online (Sandbox Code Playgroud)
并运行:
puts KlassWithSecret.new.instance_eval { @secret }
Run Code Online (Sandbox Code Playgroud)
它打印99,但如果我运行:
puts KlassWithSecret.new.instance_eval do
@secret
end
Run Code Online (Sandbox Code Playgroud)
它返回一个错误: `instance_eval': wrong number of arguments (0 for 1..3) (ArgumentError)
为什么我不能使用do/end块instance_eval?
PS我正在使用Ruby 2.1.0.
很抱歉,这个问题是重复的.但我无法找到使用上的差异.当我运行以下代码时,我得到了不同的答案.我从大多数教程中看到,使用"do ... end"与"{...}"块相同.
include Comparable
a = [1, 4, 2, 3, 5]
p a.sort do |x,y|
y <=> x
end
Run Code Online (Sandbox Code Playgroud)
输出显示为= [1,2,3,4,5]
但是当我这样跑的时候......
include Comparable
a = [1, 4, 2, 3, 5]
p a.sort { |x,y|
y <=> x
}
Run Code Online (Sandbox Code Playgroud)
输出显示为= [5,4,3,2,1]
这里有什么问题.是否存在两种语法有任何不同行为的情况?
为什么:
test = [1, 1, 1].collect do |te|
te + 10
end
puts test
Run Code Online (Sandbox Code Playgroud)
有效,但不是:
puts test = [1, 1, 1].collect do |te|
te + 10
end
Run Code Online (Sandbox Code Playgroud)
然而这有效:
puts test = [1, 1, 1].collect { |te|
te + 10
}
Run Code Online (Sandbox Code Playgroud)
对于我不知道的块,do/end构造和{}构造之间是否存在差异?
我对传球有一点疑问.
def a_method(a, b)
a + yield(a, b)
end
Run Code Online (Sandbox Code Playgroud)
这很好用.
k = a_method(1, 2) do |x, y|
(x + y) * 3
end
puts k
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
puts a_method(1, 2) do |x, y|
(x + y) * 3
end
# LocalJumpError: no block given (yield)
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释这个吗?
谢谢.Paolo Perrotta从Metaprogramming Ruby中获取的示例.好书.