zoukankan      html  css  js  c++  java
  • 匿名函数

    ---恢复内容开始---

      匿名函数用 fn 关键字创建。

    fn

      parameter-list -> body

      parameter-list -> body

    end

      例如,下面定义了一个函数,将其绑定到变量sum

    sum = fn (a, b) -> a + b end      #也可以写为 fn a, b -> a + b end
    
    sum.(1, 2)            #输出3   命名函数中没有使用点调用

      如果没有参数,还可以使用圆括号调用:

    greet = fn -> IO.puts "hello" end
    
    greet.()

    函数的模式匹配,与Elixir特性一文中相同。

    一个函数,多个函数体

      在单个函数定义中,可以定义不同的实现,取决于传入的参数类型和内容。

    handle_open = fn
    {:ok, file } -> "Read data: #{IO.read(file, :line)}"
    {_, error } -> "Error: #{:file.format_error(error)}"
    end
    
    handle_open.(File.open("XXXX"))    #文件存在与否,会输出不同的值

    能返回函数的函数

      

    fun = fn -> ( fn -> "Hello" end ) end
    
    fun.().()                # "Hello"
    
    other = fun.()    #返回内部函数
    other.()                # "Hello"        

    闭包

      作用域将其中的变量绑定封闭起来,并将它们打包到稍后能被保存且使用的东西上。

      现有如下函数:

    greeter = fn name -> ( fn -> "Hello #{name}" end ) end
    
    dave_greeter = greeter.("Dave")
    
    dave_greeter.()        # "Hello Dave"

      在这里,内部函数使用了外部函数的 name 参数, 而那时greeter.("Dave")已经返回,外部函数结束了执行,而且参数的生命周期也以结束。当定义内部函数的时候,它继承了外部函数的作用域并将 name 的绑定值传递到里面,这就是闭包。

      例:

    add_n = fn n -> ( fn other -> n + other end ) end
    
    add_two = add_n.(2)
    
    add_two.(3)            # 5

    &运算符

      &运算符将跟在其后的表达式转换为函数,在表达式内部,占位符 &1、&2对应第一、第二以及接下来的函数参数。

    add_one  = &(&1 + 1)        #等同于 add_one = fn (n) -> n + 1 end
    add_one.(44)        # 45
    
    speak = &(OP.puts(&1))
    speak.("Hello")        # Hello
  • 相关阅读:
    frame、center和bounds
    UILabel
    UIColor
    Url_Filter(Code)
    listView介绍
    C# 常用正则
    C++指针的概念
    指针所具有的四个要素:
    windows_sendEmail
    工作笔记
  • 原文地址:https://www.cnblogs.com/lr1402585172/p/11492554.html
Copyright © 2011-2022 走看看