Dart / flutter文档中的“ T”,“ f”,“ E”,“ e”,“→”代表什么?

时间:2018-12-22 09:19:01

标签: dart flutter

我正在学习颤动,但我不理解那些字母的含义。

map<T>(T f(E e)) → Iterable<T>
Returns a new lazy Iterable with elements that are created by 
calling f on each element of this Iterable in iteration order. [...]

那么,它们代表什么? 电话: F: E: e: →:

1 个答案:

答案 0 :(得分:4)

Iterable.map<T>

map<T>(T f(E e)) → Iterable<T>
     

返回带有通过调用创建的元素的新的lazy Iterable   按迭代顺序在此Iterable的每个元素上使用f。 [...]

  • T是一种语言Type,在这种情况下,它是可迭代项的类型,也是函数f必须返回的类型。
  • 告诉您整个功能(return type)的map,在这种情况下,您的Iterable中的T
  • f是应用于Element e的函数,该函数作为参数传递给函数,以便该函数可以对该当前值进行某些操作,然后返回类型为{{ 1}}基于元素T的值。

如果浏览Iterable map function definition,则会看到:

e

因此,我想从OP的确切Iterable<T> map <T>( T f( E e ) ) 功能开始,然后再举一个更复杂的示例,以简化答案。

为了澄清所有这些,让我们来看一个Iterable类的具体类,在这种情况下,Set类选择类型为map<T>的{​​{1}}:

Set

这里我有一个字符串集 String,我想要另一个字符串集 Set<String> mySet = Set(); for (int i=0; i++<5;) { mySet.add(i.toString()); } var myNewSet = mySet.map((currentValue) => (return "new" + currentValue)); for (var newValue in myNewSet) { debugPrint(newValue); } ,以便该值与原始地图的值相同,但以Set<String> 作为前缀。为此,我们可以轻松地将Set<String>及其所需的闭包用作参数。

作为闭包传递的函数是

"new:"

如果我们愿意,我们也可以这样写:

map<T>

甚至传递这样的功能:

(currentValue) => ("new:" + currentValue)
  • (currentValue) { return "new:" + currentValue; }
  • String modifySetElement(String currentValue) { return "new:" + currentValue; }
  • var myNewSet = mySet.map((value) => ("new:" + value));

这意味着函数(闭包)的参数是{{1的 element 的{{1} }}我们正在修改。 我们甚至不必指定类型,因为它是通过方法定义推断出来的,这是泛型的强大功能之一。

函数(闭包)将一次应用于所有Set的元素,但是您将其作为闭包编写一次。

enter image description here

总结一下:

  • var myNewSet = mySet.map((value) {return "new:" + value;});是字符串
  • var myNewSet = mySet.map((value) => modifySetElement("new:" + value));是我们在函数内部处理的元素
  • String是我们的闭包

让我们更深入地讲一个更复杂的例子。现在,我们将处理Dart Map类。

map函数的定义如下:

E

因此,在这种情况下,前一个Set和前一个TE(函数)的返回类型(闭包),它以元素f作为参数map<K2, V2>(MapEntry<K2, V2> f(K key, V value)) → Map<K2, V2> T对(是迭代中当前(K2, V2)元素的键和值)是f的类型,是前一个{{1 }}。

整个函数然后返回一个新的E

以下是K的实际示例:

V

在此示例中,我有一个MapEntry,我想要另一个MapEntry<K2, V2>,以便(像以前一样)该值与原始地图的值相同,但用前缀将其括起来的T

enter image description here

同样,您也可以用这种方式编写闭包(您的Map<K2, V2>函数)(也许可以更好地突出这一事实,即根据当前地图条目值创建全新的MapEntry是一种幻想)。

Map

所有这些符号之所以称为Generics,是因为它们是通用占位符,它们根据您使用它们的上下文对应于一种或另一种类型。

那是上面链接的摘录:

  

使用通用方法

     

最初,Dart的通用支持仅限于类。一种称为通用方法的较新语法允许   在方法和函数上输入参数:

Map<int, String> myMap = Map();
for (int i=0; i++<5;) {
  myMap[i] = i.toString();
}
var myNewMap = myMap.map((key, value) => (MapEntry(key, "new:" + value)));
for (var mapNewEntry in myNewMap.entries) {
  debugPrint(mapNewEntry.value);
}
     

此处first()上的通用类型参数允许您使用   在几个地方输入参数T:

     

在函数的返回类型(Map<int, String>)中。在参数类型中   (Map<int, String>)。本地变量("new:")的类型。

遵循link的通用名称约定。