天道酬勤,学无止境

proc-object

将 self 应用于 proc 的方法(A method that applies self to a proc)

问题 我想在Object上定义一个方法,该方法接受一个块并将接收器应用于该块。 一个实现将如下所示: class Object def apply ≺ pr.call(self) end end 2.apply{|x| x * 3} # => 6 是否已经有一种标准方法可以做到这一点,或者有一个具有类似用途的方法的知名库? 如果是这样,我不想重新发明轮子。 我经常遇到这样的情况,我有一个方法需要一个可选块,当没有块时,我想返回一些在方法中计算的return_value ,但是当有一个块时,我想返回返回值应用于块的return_value 。 现在,我有很多行,例如: def method ..., &pr ... pr ? pr.call(return_value) : return_value end 但我想一直写 def method ..., &pr ... pr ? return_value.apply(&pr) : return_value end 甚至更好,稍微修改一下apply定义, def method ..., &pr ... return_value.apply(&pr) end 回答1 我猜Object.tap是你要找的: "Abc".tap do |str| puts str end 回答2 这与def apply; yield self

2021-10-31 19:46:56    分类:技术分享    ruby   ruby-1.9.3   proc-object

A method that applies self to a proc

I want to have a method defined on Object that takes a block and applies the receiver to the block. An implementation will be like the following: class Object def apply ≺ pr.call(self) end end 2.apply{|x| x * 3} # => 6 Is there already a standard way to do this or a well known library that has a method with similar use? If so, I didn't want to reinvent the wheel. It happens to me very often that, I have a method that takes an optional block, and when there is no block, I want to return some return_value calculated within the method, but when there is a block, I want to return the return

2021-10-20 01:10:55    分类:问答    ruby   ruby-1.9.3   proc-object

Ruby:Proc.new {'waffles'} 与 proc {'waffles'}(Ruby: Proc.new { 'waffles' } vs. proc { 'waffles' })

问题 在 Ruby 中, Proc.new { 'waffles' }和proc { 'waffles' }之间有什么区别吗? 我发现很少有人提到第二种语法。 通过使用irb进行测试,我没有发现任何明显的差异。 第二个语法糖是第一个吗? 回答1 来自 Metaprogamming Ruby 第 113 页。 在 Ruby 1.8 中,Kernel#proc() 实际上是 Kernel#lambda() 的同义词。 由于程序员的强烈抗议,Ruby 1.9 将 proc() 改为 Proc.new() 的同义词。

2021-10-19 23:36:02    分类:技术分享    ruby   syntax   proc-object

What are the advantages of proc functions to methods

I was solving some problems on Project Euler and I mentioned that I always wrap short methods in proc functions. I asked myself "Why?". The answer was "I don't know. Maybe because it is short?". So what are the advantages of proc functions to ordinary methods except that they are short :) # Proc is_prime = proc{|number| !((number%2 == 0) || (3..Math.sqrt(number).to_i).step(2).any?{|n| (number%n).zero?})} # Ordinary method def is_prime(number) !((number%2 == 0) || (3..Math.sqrt(number).to_i).step(2).any?{|n| (number%n).zero?}) end

2021-06-24 19:50:24    分类:问答    ruby   lambda   proc-object

Ruby:将proc转换为lambda吗?(Ruby: convert proc to lambda?)

问题 是否可以将proc风味的Proc转换为lambda风味的Proc? 有点惊讶,这至少在1.9.2中不起作用: my_proc = proc {|x| x} my_lambda = lambda &p my_lambda.lambda? # => false! 回答1 要追踪这个问题有些棘手。 在寻找Proc#lambda的文档? 对于1.9,关于proc和lamdba的区别进行了相当长的讨论。 结果是, lambda强制使用了正确数量的参数,而proc没有。 从该文档中,此示例显示了将proc转换为lambda的唯一方法: 即使给出了非lambda Proc对象, define_method始终定义没有技巧的方法。 这是不保留技巧的唯一例外。 class C define_method(:e, &proc {}) end C.new.e(1,2) => ArgumentError C.new.method(:e).to_proc.lambda? => true 如果要避免污染任何类,可以只在匿名对象上定义单例方法,以将proc强制为lambda : def convert_to_lambda &block obj = Object.new obj.define_singleton_method(:_, &block) return obj.method(:_).to_proc

2021-05-08 00:32:30    分类:技术分享    ruby   lambda   proc-object

如何在Ruby中封送lambda(Proc)?(How do I marshal a lambda (Proc) in Ruby?)

问题 Joe Van Dyk询问了Ruby邮件列表: 你好, 在Ruby中,我想您无法编组lambda / proc对象,对吗? 是否可以用lisp或其他语言? 我正在尝试做的是: l = lamda { ... } Bj.submit "/path/to/ruby/program", :stdin => Marshal.dump(l) 因此,我正在向BackgroundJob发送一个lambda对象,该对象包含要执行的操作的上下文/代码。 但是,猜测那是不可能的。 我最终整理了一个正常的红宝石对象,其中包含程序运行后的操作说明。 乔 回答1 您无法封送Lambda或Proc。 这是因为它们都被视为闭包,这意味着它们会在定义它们的内存周围关闭并可以引用它。 (要封送它们,您必须封送它们在创建时可以访问的所有内存。) 正如Gaius指出的那样,您可以使用ruby2ruby获取该程序的字符串。 也就是说,您可以封送代表红宝石代码的字符串,然后在以后重新评估它。 回答2 您也可以只将代码作为字符串输入: code = %{ lambda {"hello ruby code".split(" ").each{|e| puts e + "!"}} } 然后用eval执行 eval code 这将返回一个红宝石lamda。 使用%{}格式可对字符串进行转义,但仅在不匹配的花括号上关闭。

2021-05-06 13:32:25    分类:技术分享    ruby   serialization   lambda   proc-object

Why does the break statement in ruby behave differently when using Proc.new v. the ampersand sign?

The break statement for blocks (as per The Ruby Programming Language) is defined as follows: it causes the block to return to its iterator and the iterator to return to the method that invoked it. Therefore when the following code is run, it results in a 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 While the following code does not throw a LocalJumpError. What is special about the ampersand sign? Doesn't the ampersand sign implicitly use Proc.new

2021-05-01 15:26:47    分类:问答    ruby-on-rails   ruby   proc-object

Inconsistency of arity between Hash.each and lambdas

I lifted the following example from 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 when I put it in the the rails console (irb), and call it with a hash, I get the following: 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 (irb):37:in `each' from (irb)

2021-04-30 12:06:33    分类:问答    ruby   lambda   closures   proc-object

您如何对Ruby代码进行字符串化/序列化?(How do you stringize/serialize Ruby code?)

问题 我希望能够在我的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 + y } # => "lambda { |y|\n (x + y)\n}" ...字符串输出不包含x的定义。 是否有一种解决方案可以考虑到这一点,也许可以通过序列化符号表来解决? 您可以在Ruby中访问它吗? 编辑2 :我更新了我的答案以合并序列化局部变量。 这似乎可以接受。 回答1 使用Ruby2Ruby def save_for_later(&block)

2021-04-29 07:29:41    分类:技术分享    ruby   serialization   lambda   proc-object

为什么显式收益在Proc中有所作为?(Why does explicit return make a difference in a Proc?)

问题 def foo f = Proc.new { return "return from foo from inside proc" } f.call # control leaves foo here return "return from foo" end def bar b = Proc.new { "return from bar from inside proc" } b.call # control leaves bar here return "return from bar" end puts foo # prints "return from foo from inside proc" puts bar # prints "return from bar" 我认为return关键字在Ruby中是可选的,无论您是否要求,您总是会return ing。 鉴于此,我发现foo和bar具有不同的输出是令人惊讶的,这取决于foo在Proc f包含显式return的事实。 有人知道为什么会这样吗? 回答1 Ruby具有三个构造: 块不是对象,而是由{ ... }或do ... end 。 proc是由Proc.new或proc创建的Proc对象。 lambda是由lambda (或Ruby 1.8中的proc )创建的Proc 。 Ruby具有三个从某事物返回的关键字:

2021-04-24 15:07:26    分类:技术分享    ruby   return   proc-object