- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我一直在阅读 Flanagan-Matz 的 Ruby Programming Language 一书
上下文:Proc.new 和 lambda w.r.t return 语句之间的区别
书中指出,在 lambda 中返回应该不引发 LocalJumpError(因为 lambda 类似于方法调用)。 lambda 中的返回只是退出 lambda - 而不是包含迭代器的方法。
但是下面的代码片段另有说明。这里有什么问题?
def caller( aProc, switch)
puts "Start Caller"
case switch
when :normal_block; iterator &aProc
when :block_parameter; iterator_blockparam(&aProc)
else iterator_param(aProc)
end
puts "End Caller"
end
def iterator
puts "Begin iterator"
[1,2,3,4].each { |x| yield x }
puts "End iterator"
end
def iterator_blockparam(&block)
puts "Start Iterator wBlockParam"
puts "Block is {block.lambda? ? 'Lambda' : 'Proc'}"
[1,2,3,4].each { |x| block[x] }
puts "End Iterator wBlockParam"
end
def iterator_param(aProc)
puts "Start Iterator wParam"
puts "Block is {aProc.lambda? ? 'Lambda' : 'Proc'}"
[1,2,3,4].each{ |x| aProc[x]}
puts "End Iterator wParam"
end
# enclosing method Proc.new already returned.
no3proc = Proc.new{|x| return -101 if x == 3; puts x }
no3lambda = lambda{|x| return -101 if x == 3; puts x }
#~ caller( no3proc, :normal_block) #=> LocalJumpError
caller( no3lambda, :normal_block ) # => LJE
#~ caller( no3proc, :block_parameter) #=> LJE
#~ caller( no3lambda, :block_parameter) # works!
#~ caller(no3proc, :with_param) #=> LJE
#~ caller(no3lambda, :with_param) # works!
最佳答案
LJE 不是由于从方法中返回,而是从调用 block 的数组迭代器中返回。您不能从数组迭代器返回。通过简单地尝试从以下每个 block 返回来查看重现的行为:
[1,2,3].each {|x| return x } LocalJumpError: unexpected return from (irb):7 from (irb):7:in `each' from (irb):7
编辑:好的,我收回它,你可以从迭代器中返回。我的 LJE 是因为我在控制台中 (argh)。
编辑:好的,我明白你的问题了。基本问题是为什么 block[x]
工作和yield x
不会(假设 &block 是一个 lambda)。
似乎
yield x
从 block 中内联解释代码并在数组迭代器的上下文中调用它,这将抛出 LJE(如上所述)和
block[x]
不内联代码,只返回 block 本身。
因此,由于未能回答您的问题,我至少将其提炼为以下内容:
def call_as_block(&block)
block.call
end
def call_as_yield
yield
end
proc_return = Proc.new { return }
lambda_return = lambda { return }
call_as_block &proc_return # throws LJE
call_as_yield &proc_return # throws LJE
call_as_block &lambda_return # does NOT throw LJE
call_as_yield &lambda_return # throws LJE
所以看起来的区别不在 lambda 和 Proc 之间,它们的行为符合预期,而是在通过 yield
调用 lambda 之间。并通过 block.call
调用 lambda .打电话yield
似乎使 lambda 的行为就好像它是 Proc 一样,并试图从方法的上下文中返回。
关于ruby - LocalJumpError 是如何从以下 lambda 抛出的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221738/
ruby 2.0 为什么下面的代码会给出意外的返回(LocalJumpError)? # some code here puts "Scanning for xml files .." zip_fil
这段 Ruby 2.0 代码有什么问题? p (1..8).collect{|denom| (1...denom).collect{|num| r = Rational(num
我一直在阅读 Flanagan-Matz 的 Ruby Programming Language 一书 上下文:Proc.new 和 lambda w.r.t return 语句之间的区别 书中指出,
Ruby 和 StackOverflow 新手在这里学习 Ruby 并遇到了我的第一个主要障碍。我真的很难全神贯注于 Procs 和 Lambdas。这是我正在使用的代码。 def procBuild
运行Rails Server或Rails控制台时出现这种奇怪的行为。 服务器/控制台在抛出此异常的代码中的各个位置崩溃: script/rails:6:in `require': unexpected
此方法适用于我的本地计算机,但不适用于我的远程服务器。它正在寻找一个 block ,但我不知道“在哪里”或“如何”放置它。 def generate_csv if params[:print_en
这个问题在这里已经有了答案: Code block passed to each works with brackets but not with 'do'-'end' (ruby) (3 个答案)
在 Rails 3.0.5 和 Ruby 1.9.3 中,是否可以定义 around_save 回调的主体与 around_save 声明内联? 也就是说,我注意到这个案例工作正常: around_s
好的,我正在尝试创建一个带有嵌套模板的应用程序。我正在使用 Rails 3 Beta 2 和 Haml。我四处寻找,决定采用最清晰的方法,并像这样构建我的模板: # application.html.
此代码在一台机器上有效,但在另一台机器上无效: puts 1.upto(5) 在工作机器上,代码返回'#'。 在另一台机器上,我得到这个错误: test.rb:1:in `upto': 没有给出 bl
所以我制作了一个功能不多的小应用程序。它只有一个带有索引方法的 Controller ,可以进行一些数学运算。这是一个测试应用程序。我希望这个测试应用程序在包装在 WAR 中的 Tomcat 上运行。
我是一名优秀的程序员,十分优秀!