我有时难以理解如何调用函数。我正在研究清单,并正在编写其方法的示例。
$breakpoints: ( s: (320, 479), sm: (480, 767), m: (768, 1023), l: (1024, 1439), xl: (1440, null));
@function returnThatMap() {
@each $name, $values in $breakpoints {
@for $i from 1 through length($name) {
$min: nth($values, 1);
// if the last one
@if ($i == length($name)) {
@return 'calc($i * 1.2) $min / 16 * 1em'
}
// if not the last one
@else {
@return 'calc($i * 1.2) $min / 16 * 1em',
}
}
}
}
$ms-range : returnThatMap() ;
// OUTPUT FORMAT NEEDED below!! (dummy numbers, but correct syntax - ie. number ' ' [number]em,number ' ' [number]em, number ' ' [number]em;)
// $ms-range:
// 1.2 20em,
// 1.333 30em,
// 1.618 40em,
// 1.8 50em,
// 2 60em;
定义如下
andThen
我知道我必须将函数文字传递给def andThen[C](k: (A) ⇒ C): PartialFunction[Int, C]
。所以我创建了以下代码。
andThen
由于列表是Integers,A必须是Int。 C可以是任何函数,取决于函数文字的输出。
以上是有道理的。
后来我尝试了scala> val l = List (1,2,3,4)
l: List[Int] = List(1, 2, 3, 4)
//x:Int works
scala> val listAndThenExample = l.andThen((x:Int) => (x*2))
listAndThenExample: PartialFunction[Int,Int] = <function1>
//underscore works
scala> val listAndThenExample = l.andThen(_*2)
listAndThenExample: PartialFunction[Int,Int] = <function1>
。其签名如下
applyOrElse
从上面,我知道A1可以是Int或它的子类(upperbound),而某些B1将是返回类型(取决于我在默认函数中所做的)。
如果我对A1和B1的理解是正确的,则x将是Int或其子类,默认函数文字应该采用Int(或子类)并返回一些B1。我尝试按如下方式调用该函数,但在使用def applyOrElse[A1 <: Int, B1 >: A](x: A1, default: (A1) ⇒ B1): B1
时它不起作用,但在我使用y:Int
时起作用。我不明白为什么。
_:Int
问题 - 为什么x:Int和_:Int都适用于然后而不适用于applyOrElse?
问题 - 什么是'A'以及为什么B1与A有关?
答案 0 :(得分:1)
根据文档,applyOrElse(x, default)
相当于
if (pf isDefinedAt x) pf(x) else default(x)
在这种情况下,您的部分函数是一个列表,即从索引(0到3)到值(1,2,3,4)的函数。所以当你这样做时
l.applyOrElse(y,(x:Int)=>println("Wrong arg "+x))
你说&#34;如果有意义,请致电l(y)
,否则println("Wrong arg"+y)
&#34;。编译器合理地回应,&#34;什么是y
?&#34;
如果您使用实际值,则按预期工作
l.applyOrElse(3 ,(x:Int)=>println("Wrong arg "+x)) // returns 4
l.applyOrElse(8 ,(x:Int)=>println("Wrong arg "+x)) // prints Wrong arg 8
使用下划线做了完全不同的事情,你得到一个部分应用的函数(这与部分函数完全不同!)
val f = l.applyOrElse(_:Int, (x:Int)=>println("Wrong arg "+x))
f(8) // prints Wrong arg 8
答案 1 :(得分:0)
你还没有宣布y,所以试图使用它是一个错误。 _:Int
有效,因为现在正在创建部分应用的函数。请注意,返回类型不是值,而是函数。这个返回的函数是applyOrElse
,第二个参数已经提供(但不是第一个)。
使用andThen
示例,_
的使用意味着不同的东西,特别是它是函数文字的简写符号。