Tag: proc object

当使用Proc.new v。&符号时,为什么ruby中的break语句表现不同?

块的break语句( 根据Ruby Programming Language )定义如下: 它导致块返回到它的迭代器,迭代器返回到调用它的方法。 因此,当运行以下代码时,它会导致LocalJumpError。 def test puts “entering test method” proc = Proc.new { puts “entering proc”; break } proc.call # LocalJumpError: iterator has already returned puts “exiting test method” end test 虽然以下代码不会抛出LocalJumpError。 &符号有什么特别之处? &符号是否隐含使用Proc.new? def iterator(&proc) puts “entering iterator” proc.call # invoke the proc puts “exiting iterator” # Never executed if […]

Hash.each和lambdas之间的arity不一致

我从Josh Susser那里得到了以下例子 def strip_accents params thunk = lambda do |key,value| case value when String then value.remove_accents! when Hash then value.each(&thunk) end end params.each(&thunk) end 当我把它放在rails控制台(irb)中,并用哈希调用它时,我得到以下内容: ruby-1.9.2-p136 :044 > `ruby –version` => “ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux]\n” ruby-1.9.2-p136 :045 > strip_accents({:packs=>{:qty=>1}}) ArgumentError: wrong number of arguments (1 for 2) from (irb):32:in `block in strip_accents’ from […]

如何在Ruby中编组lambda(Proc)?

Joe Van Dyk 询问了Ruby邮件列表 : 嗨, 在Ruby中,我猜你不能编组一个lambda / proc对象,对吗? 在lisp或其他语言中这可能吗? 我想做什么: l = lamda { … } Bj.submit “/path/to/ruby/program”, :stdin => Marshal.dump(l) 所以,我向BackgroundJob发送一个lambda对象,其中包含要执行的操作的上下文/代码。 但是,猜测这是不可能的。 我最终编组了一个普通的ruby对象,其中包含程序运行后要执行的操作的说明。 乔

你如何串行化/序列化Ruby代码?

我希望能够在我的Ruby代码中编写lambda / Proc,将其序列化以便我可以将其写入磁盘,然后再执行lambda。 有点像…… x = 40 f = lambda { |y| x + y } save_for_later(f) 后来,在一个单独的Ruby解释器运行中,我希望能够说…… f = load_from_before z = f.call(2) z.should == 42 Marshal.dump不适用于Procs。 我知道Perl有Data :: Dump :: Streamer ,在Lisp中这很简单。 但有没有办法在Ruby中做到这一点? 换句话说,以后会save _ for _ later实现什么? 编辑 : 我的答案很好,但它不会关闭自由变量(如x )并将它们与lambda序列化。 所以在我的例子中…… x = 40 s = save_for_later { |y| x + […]

Ruby:将proc转换为lambda?

是否有可能将proc-flavored Proc转换为lambda风味的Proc? 有点惊讶,这不起作用,至少在1.9.2: my_proc = proc {|x| x} my_lambda = lambda &p my_lambda.lambda? # => false!