Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 什么是匿名函数?_Ruby_Anonymous Function - Fatal编程技术网

Ruby 什么是匿名函数?

Ruby 什么是匿名函数?,ruby,anonymous-function,Ruby,Anonymous Function,在我的一千行Ruby之旅中,我对匿名函数的概念感到非常困难。维基百科代码中有一些无名的灵魂,它向更高的层次屈服,但我的理解到此为止 或者换句话说,当我理解它时,我该如何向我妈妈解释匿名函数?正如维基百科所说:一个没有名字的函数 这意味着您无法使用函数名和参数以典型方式调用函数。相反,函数本身通常是另一个函数的参数。对函数进行操作的函数称为“高阶函数” 考虑一下这个JavaScript(我知道你标记了这个ruby,但是…): 该函数将在页面加载时执行,但您不能按名称调用它,因为它没有名称。匿名函数

在我的一千行Ruby之旅中,我对匿名函数的概念感到非常困难。维基百科代码中有一些无名的灵魂,它向更高的层次屈服,但我的理解到此为止


或者换句话说,当我理解它时,我该如何向我妈妈解释匿名函数?

正如维基百科所说:一个没有名字的函数

这意味着您无法使用函数名和参数以典型方式调用函数。相反,函数本身通常是另一个函数的参数。对函数进行操作的函数称为“高阶函数”

考虑一下这个JavaScript(我知道你标记了这个ruby,但是…):


该函数将在页面加载时执行,但您不能按名称调用它,因为它没有名称。

匿名函数具有以下特征:

  • 它没有名字(因此是匿名的)
  • 是内联定义的
  • 当您不需要普通函数的开销/形式时使用
  • 除非作为参数传递给另一个函数,否则不会多次显式引用

  • 下面是Ruby中匿名函数的一个示例(本例中称为块):

    上面的匿名函数在哪里?它接收单个参数,将其命名为“item”,然后打印出来。在JavaScript中,上述内容可以写成

    Array.prototype.each=函数(anon){
    
    对于(var i=0,len=this.length;i在沉迷于以前的答案中,匿名函数在处理以下问题时非常有用:

    或者(在Ruby 1.9中):

    匿名方法的意义是什么? 类比解释: 当我点我最喜欢的汉堡(一种油腻的大Nac)时,我不想花5分钟填写正式的订单申请:姓名、地址、电话号码等。我没有时间。我想用我的嘴:“给我一个汉堡”,又好又快又简单

    匿名方法与此类似,但编码时除外:

    这有点像一次性方法,可以让你更快地编写代码
    编码时也是如此。如果你必须定义一个函数,你必须把它放在别的地方,你必须称它为某种东西,这是一种痛苦,特别是如果你知道你永远不再需要它。当你阅读代码时,你可能不得不使用一个复杂的IDE来再次找到该方法,以及对它的引用。真是痛苦!你需要一个一次性方法,你可以直接在你的代码中编写,在你需要它的地方,然后完成它,并移动一个。匿名方法可解决此特定问题。

    匿名函数具有以下特征:

    • 没有名字
    • 内联声明
    • 声明时直接执行

    +1此外,由于您询问的是ruby,匿名ruby函数被称为lambdas。“匿名函数”是Perl社区和javascript社区中更常用的术语吗?您可以在lisp/scheme中称之为lambda表达式。在1.9示例中,您也可以使用
    call
    的语法sugar:
    t\u 1\u 9。(1) 
    …在1.8和1.9中,lambda也可以通过
    t\u 9[1]
    调用(它比
    .call
    ()
    都短,在我看来,更美观)。你能解释一下你所说的“不被多次明确引用”的意思吗?我觉得它不正确。例如:
    x=lambda{…};def bar(y);@opts={callback:y};end;bar(x)
    现在该函数有两个引用,如果
    bar
    创建任何闭包,则很容易有三个引用。为什么您建议这些引用以某种方式使这个lambda不再是“匿名函数”?您能解释一下“是内联定义的”是什么意思吗?如果某个东西不是“内联定义的”(但与您的其他标准相匹配),它将不再是“匿名函数”,那么该例子是什么?内联是指将匿名函数用作参数或在另一个函数体中定义等。非内联将是一个典型的函数。4是错误的。它们只有在多次引用时才有意义,就像smalltalk中的块一样。我不熟悉smalltalk,但如果我t没有名字?在公认的答案中,几乎所有这些观点都已经被详细提到。
      window.onload=function(){
               //some code here
      }
    
    my_array.each{ |item| puts item }
    
    def count_to(n)
      puts "I'm going to count to #{n}"
      count = lambda do |i|
        if (i>0)
          count[i-1]
          puts i
        end
      end
      count[n]
      puts "I'm done counting!"
    end
    count_to(3)
    #=> I'm going to count to 3
    #=> 1
    #=> 2
    #=> 3
    #=> I'm done counting!
    
    print_it = lambda{ |item| puts item }
    %w[a b c].each(&print_it)
    #=> a
    #=> b
    #=> c
    
    module Enumerable
      def do_both_to_each( f1, f2 )
        each do |item|
          f1[item]
          f2[item]
        end
      end
    end
    
    print_prefix  = lambda{ |i| print "#{i}*#{i} -> " }
    print_squared = lambda{ |i| puts i*i }
    
    (1..4).do_both_to_each(print_prefix,print_squared)
    #=> 1*1 -> 1
    #=> 2*2 -> 4
    #=> 3*3 -> 9
    #=> 4*4 -> 16
    
    def make_adder n
      lambda { |x|
        x + n
      }
    end
    
    t = make_adder 100
    puts t.call 1
    
    def make_adder_1_9 n
       ->(x) {
         x + n
       }
    end
    
    t_1_9 = make_adder_1_9 100
    puts t_1_9.call 1