代码之家  ›  专栏  ›  技术社区  ›  esac

如何创建扩展方法(f)?[复制品]

  •  22
  • esac  · 技术社区  · 15 年前

    这个问题已经有了答案:

    例如,我如何在f中创建扩展方法,如C扩展:

        public static string Right(this string host, int index)
        {
            return host.Substring(host.Length - index);
        }
    
    2 回复  |  直到 11 年前
        1
  •  21
  •   kvb    15 年前

    对于可以从f调用的f扩展:

    type System.String with
      member x.Right(index) = x.Substring(x.Length - index)
    

    注意,从beta 1开始,这不会导致C兼容的扩展方法。

    要生成从C_可见的扩展方法(但在F_中不能用作扩展方法),请参见Brian编辑到原始文章的链接。

        2
  •  3
  •   YotaXP    15 年前

    我知道这并不能真正回答你的问题,但值得指出。在F和其他函数语言中,您经常会看到带有静态方法(如seq模块)的模块,这些方法设计为与其他函数组合在一起。据我所见,实例方法不容易组合,这就是这些模块存在的原因之一。在这个扩展的情况下,您可能需要向字符串模块添加一个函数。

    module String =
        let right n (x:string) =
            if x.Length <= 2 then x
            else x.Substring(x.Length - n)
    

    这样就可以使用了。

    "test"
    |> String.right 2 // Resulting in "st"
    
    ["test"; "test2"; "etc"]
    |> List.map (String.right 2) // Resulting in ["st"; "t2"; "tc"]
    

    尽管在这种情况下,扩展方法不会有更多的代码。

    ["test"; "test2"; "etc"]
    |> List.map (fun x -> x.Right 2)