繁体   English   中英

在此示例中,lambda的目的是什么?

[英]What is the purpose of lambda in this example?

在此示例中,lambda在组合和水合方法中都使用。 Lambda在这里做什么?

def compose *lambdas
  if lambdas.empty?
    lambda { nil }
  elsif lambdas.size == 1
    lambdas.first
  else
    lambda do |n|
      lambdas.first.call(compose(*lambdas[1..-1]).call(n))
    end
  end
end

def hydrate(modulus, printable_form)
  i = 0
  lambda do |n|
    (i = (i + 1) % modulus) == 0 && printable_form || n
  end
end

print(((1..100).map
   &compose(
     hydrate(15, 'Watermelon'), 
     hydrate(5, 'Melon'), 
     hydrate(3, 'Water'))).join(' '))

我的第二个问题是-组成单词前面的&符有什么需要?

该函数compose接受一个函数列表,并返回一个新分配的函数,该函数是列表中所有函数的组成。 它被编写为相当奇怪地对待空列表。 可能是第一种情况应被忽略。 (通常,编写空的函数列表应该会生成标识函数,但这不是您的示例所做的。我原本希望

lambda do |n| { n }

作为基本案例。)

必须使用lambda才能创建新函数。在compose的递归情况下,您会看到: lambda创建了一个新函数,当给定n时,该函数返回调用其余函数的组合的结果,然后最后应用第一个功能。 这不是要模拟的好代码,因为每次调用该组合时都会重复对函数列表进行递归 在示例中:

  • 使用恒定的时间和空间来创建功能组合

  • 应用功能组合会花费线性时间和空间

而如果代码编写正确

  • 创建功能组合应该花费线性时间和空间

  • 应用功能组合应该花费线性时间,并且不需要分配(零空间)

不幸的是,我不知道足够的红宝石为你写的例子compose它应该做的方式。 但是其他人会的。

顺便提一句,我不知道您在哪里得到这个确切的代码,但是它看起来像是Reginald Braithwaite博客中某些代码的很小改动的版本。 (该代码是针对FizzBu​​zz问题的故意过度解决方案,用于认真讨论Ruby中的函数编程以及更一般的函数编程。)

以下是原始帖子:

您的第二个问题询问&在做什么。

查看Ruby的一元&符 ,该&符将proc转换为块。

例:

irb(main):001:0> def meth1
irb(main):002:1>   yield "Hello"
irb(main):003:1> end
=> nil

用一个块调用meth1,按预期方式工作:

irb(main):004:0> meth1 { |s| puts s } # Calling meth1 with a block
Hello
=> nil

用Proc调用不起作用:

irb(main):005:0> p = Proc.new { |s| puts "In proc: #{s}" }
=> #<Proc:0x13e5d60@(irb):5>
irb(main):006:0> meth1 p
ArgumentError: wrong number of arguments (1 for 0)
        from (irb):6
        from C:/Ruby19/bin/irb:12:in `<main>'

但是,如果将Proc转换为块,它确实可以工作:

irb(main):007:0> meth1 &p # Convert the proc to a block
In proc: Hello
=> nil

使用以下代码时,这就是发生的事情:

irb(main):001:0> def meth2(&block) # Block is converted to Proc
irb(main):002:1>   puts block.class.to_s if block_given?
irb(main):003:1> end
=> nil
irb(main):004:0> meth2 { puts "Hi There" }
Proc
=> nil
irb(main):005:0>

这是另一篇关于块之间的区别的文章,即block vs lambda vs proc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM