我们假设我们有一个泛型类Container:
case class Container[+A](value: A)
Run Code Online (Sandbox Code Playgroud)
然后,我们希望模式匹配一个Container有Double和Container的Any:
val double = Container(3.3)
var container: Container[Any] = double
Run Code Online (Sandbox Code Playgroud)
为此,我们通常会写:
container match {
case c: Container[String] => println(c.value.toUpperCase)
case c: Container[Double] => println(math.sqrt(c.value))
case _ => println("_")
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器会给出两个警告,前两个案例各一个.例如,第一个警告说:"类型模式容器[String]中的非变量类型参数字符串未被选中,因为它被擦除".由于擦除,在运行期间不可能区分不同类型的容器并且第一个捕获物将匹配.因此,类型的容器Container[Double]将与捕获Container[String]对象的第一个案例匹配,因此toUpperCase将在a上调用方法,Double并且java.lang.ClassCastException将抛出a.
如何匹配Container特定类型的参数化?
Reddit目前正在将其数据库从PosgreSQL迁移到Apache Cassandra.有人知道Reddit在Cassandra中使用了什么数据库模式吗?
我经常遇到一个模式,所以我想知道Scala库中是否有任何方便的方法.
让它成为一种功能f: A => Option[B].我愿做一个反复调用f一个起点开始x,f(f(f(x).get).get...)直至f恢复None并保持最后的非None价值.
我为此写了一个实现:
@tailrec
def recurrentCallUntilNone[B](f: B => Option[B], x: B): B = f(x) match {
case Some(y) => recurrentCallUntilNone(f, y)
case None => x
}
Run Code Online (Sandbox Code Playgroud)
这已经在标准库中实现了吗?
对此的使用示例可以是用于保持当前位置的列表(Zipper).通过调用next,None如果在当前位置之后没有元素或者Option对于相同列表没有元素但是当前位置递增,则返回.通过使用上述方法,end可以构造一种寻找列表到最后的方法.
如果要在Scalding中创建一个包含超过22个字段的管道,则受Scala元组的限制,Scala元组的数量不能超过22个.
有没有办法使用集合而不是元组?我想象下面的例子,遗憾的是它不起作用:
input.read.mapTo('line -> aLotOfFields) { line: String =>
(1 to 24).map(_.toString)
}.write(output)
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个form带有 atextarea和 a的博客评论span,它向用户显示可以在文本区域中引入的剩余字符数。
所以我有这个表格:
<form action="comment.php" method="POST" accept-charset="utf-8">
<textarea name="comment" id="comment" rows="4" cols="56"></textarea>
<input type="submit" value="Post" />
<span id="comment-chars-left">512</span> characters left
</form>
Run Code Online (Sandbox Code Playgroud)
然后我编写了以下 jQuery 代码:
$('#comment')
.keydown(function(event) {
$('#comment-chars-left').html('' + (512 - $textarea.val().length));
});
Run Code Online (Sandbox Code Playgroud)
问题是,当.keydown首先调用输入时,它会打印剩余字符的数量,然后输入的新字符显示在textarea. 因此剩余字符数没有正确的值,大了一个单位。要使这项工作正常进行,.keydown应在插入新字符后调用。
我该如何解决这个问题?
当在Scala中将节点序列声明为文字时,您会产生一个scala.xml.NodeBuffer可变的(它扩展ArrayBuffer[scala.xml.Node]而后者又扩展Seq[scala.xml.Node]):
scala> val xml = <a /><b />
xml: scala.xml.NodeBuffer = ArrayBuffer(<a></a>, <b></b>)
scala> xml += <c />
res46: xml.type = ArrayBuffer(<a></a>, <b></b>, <c></c>)
scala> xml
res47: scala.xml.NodeBuffer = ArrayBuffer(<a></a>, <b></b>, <c></c>)
Run Code Online (Sandbox Code Playgroud)
这与Scala使用不可变对象和函数式编程的哲学相矛盾.为什么默认情况下集合是不可变的,但XML文字(它们是一等公民)在这种情况下不是?
但是,是否可以使用XML文字安全地定义不可变节点序列?
我正在使用AJAX(使用jQuery)请求一个包含对Apache + PHP服务器的Javascript函数调用的标记.这是HTML和AJAX代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="http://localhost/LivingLab/javascript/jquery.min.js"></script>
</head>
<body>
<a href="javascript: void(0)" onclick="
$.post(
'http://localhost/test.php', // server target page
{some_var: 'abc'}, // data to be sent via POST method
function(data) { // JS callback function
$('#container').html(data); // innerHTML of <div id="container"> will be replaced
}
)
">Click me!</a>
<div id="container"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
AJAX请求页面'http://localhost/test.php',它具有以下PHP代码:
<?php
echo '<script type="text/javascript"> document.write("Javascript output"); </script>';
?>
Run Code Online (Sandbox Code Playgroud)
当我点击链接时,在AJAX请求之后,整个页面被"Javascript output"替换,而不是仅在id为"container"的div标签内写入.
如果PHP服务器脚本写入其他内容,而不是像这样的脚本标记:
<?php echo 'text' ?>
Run Code Online (Sandbox Code Playgroud)
通过用id"container"替换div而不是整个页面,AJAX调用表现正常.
我试图用Wireshark调查这个页面传输的HTTP数据,它似乎不是一个HTTP问题,因为服务器响应正是它应该是这样的:
<script …Run Code Online (Sandbox Code Playgroud) scala ×4
javascript ×2
jquery ×2
ajax ×1
cassandra ×1
html ×1
immutability ×1
php ×1
reddit ×1
scalding ×1
type-erasure ×1
xml ×1