相关疑难解决方法(0)

为什么在分配变量时,do/end块的行为/返回方式不同?

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]

ruby

3
推荐指数
1
解决办法
297
查看次数

Instance_eval不适用于do/end块,仅适用于{} -blocks

如果我有课:

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.

ruby instance-eval

3
推荐指数
1
解决办法
419
查看次数

红宝石中'do..end'和"{..}"块的不同行为

很抱歉,这个问题是重复的.但我无法找到使用上的差异.当我运行以下代码时,我得到了不同的答案.我从大多数教程中看到,使用"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]

这里有什么问题.是否存在两种语法有任何不同行为的情况?

ruby

3
推荐指数
1
解决办法
87
查看次数

基本的ruby问题:块的{} vs do/end构造

可能的重复:
使用do block vs bracket {}
Ruby中这些块编码样式的区别或价值是什么?

为什么:

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构造和{}构造之间是否存在差异?

ruby syntax programming-languages

2
推荐指数
1
解决办法
387
查看次数

将块传递给方法 - Ruby

我对传球有一点疑问.

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中获取的示例.好书.

ruby block

2
推荐指数
1
解决办法
831
查看次数