在本教程中学习了Scala高级类型的一些示例后,我开始讨论(a)implicits和(b)编写方法的技术,这些方法通常处理被定义为高级类型的特征的子类.我已经在(b)这里得到了一个很好的答案, 这让我更接近解决下面的问题:
我想创建一个工厂来创建单件容器(集合,列表,数组),它将我传入的项目包装到工厂函数中. [即使已经有一个Scala库可以做到这一点,我也是这样做的学习练习.但是,嘿......如果有的话,请告诉我!]
最终的结果应该让我这样做:
scala> var j: Set[String] = wrapItemInContainer("foo")
j: Set[String] = Set(foo)
scala> var k: List[Int] = wrapItemInContainer(9)
k: List[Int] = List(9)
Run Code Online (Sandbox Code Playgroud)
我想出的解决方案如下所示.我必须提供一个恼人的虚拟最终参数,以便我可以帮助编译器找出我想要的容器类型.这是有效的,但我感到困惑的是,我想将结果分配给(j,k..etc.)的变量的类型签名没有给编译器足够的信息来确定哪个隐式定义的ContainerFactory需要使用.
这个笨重的解决方案有效:
trait ContainerFactory[M[_]] { def put[A](x: A): M[A] }
implicit val factory = new ContainerFactory[List] { def put[A](x: A) = List(x) } // factory for List containers
implicit val factory2 = new ContainerFactory[Set] { def put[A](x: A) = Set(x)} // factory for Set containers
def wrapItemInContainer[ M[A]: ContainerFactory, A](item: A, …Run Code Online (Sandbox Code Playgroud) 我一直在研究一些关于 scala 无限流的帖子,以便更好地理解这个概念。我喜欢这篇文章中的简单解决方案,我将其复制如下:
def fib: Stream[Long] = {
def tail(h: Long, n: Long): Stream[Long] = h #:: tail(n, h + n)
tail(0, 1)
}
Run Code Online (Sandbox Code Playgroud)
我对发生的情况的最初理解是,我们返回一个 Stream[Long] 对象,并覆盖了 tail 方法。为了测试这个(看似不正确的)假设,我做了以下操作,但无法编译:
def fib: Stream[Long] = {
override def tail(h: Long, n: Long): Stream[Long] = h #:: tail(n, h + n)
^
|
~error~~~
tail(0, 1)
}
Run Code Online (Sandbox Code Playgroud)
所以这个解决方案似乎确实基于覆盖。所以,现在我想知道......Scala 构造到底发生了什么,它具有某种类型“T”的 def,其中该块的值包含另一个 def,乍一看似乎覆盖了 T 的方法?
预先感谢您启发我!
编辑 - 这是在 Mateusz Dymczyk 的出色答案中尝试解决方案的结果:
object Foolaround extends App {
def fib: Stream[Long] = {
def …Run Code Online (Sandbox Code Playgroud) 我需要使用Source.getLines()创建一个迭代器,并快速查看Scala源代码,并且在运行一些测试之后,即使在迭代器耗尽之后(即,在hasNext()之后,迭代器似乎也不会关闭)开始是虚假的).
我想知道什么是Scala推荐的关闭/释放用于创建迭代器的资源的技术.我发现了一个有趣的库,似乎可以解决这个问题:
https://github.com/jsuereth/scala-arm
Run Code Online (Sandbox Code Playgroud)
但是,如果可能的话,我更愿意使用核心scala库而不是第三方的东西.如果您对我的测试方式感兴趣(在Linux上使用'lsof'列出打开的文件),我的代码如下:
object Test extends App {
import sys.process._
import scala.io.Source._
"echo hello world" #> new java.io.File("/tmp/testing") !
val src = fromFile("/tmp/testing")
val iter: Iterator[String] = src.getLines()
while (iter.hasNext) {
println("line=" + iter.next())
}
println("iterator exhausted.. sleeping while we check if file is still open using lsof")
Thread.sleep(200000)
}
Run Code Online (Sandbox Code Playgroud)
运行程序后它仍处于休眠状态,请运行以下命令:
lsof | grep /tmp/testing
Run Code Online (Sandbox Code Playgroud)
你可能会看到这样的输出:
java 15813 ...253,0.... 12 .. lots-of-othernumbers..0462 /tmp/testing
Run Code Online (Sandbox Code Playgroud)
然后当程序终止时,grep将变为空(如你所想).
提前感谢您提供的任何提示!
我正在学习参加数据砖火花认证考试,以及他们的练习考试(请参阅> https://databricks-prod-cloudfront.cloud.databricks.com/public/793177bc53e528530b06c78a4fa0e086/0/6221173/100020/latest html ) 要求我们接受此声明为真实事实:
“显式缓存会干扰 Catalyst 优化器优化某些查询的能力,从而降低应用程序性能”
尽管我已经阅读了很多关于催化剂的内容并且对细节有很好的掌握,但我还是把这个问题弄错了。所以我想巩固我对这个主题的了解,并转到解释这个断言背后的方法和原因的来源。
任何人都可以提供这方面的指导吗?具体来说,为什么会这样?我们如何确保在缓存数据集时实际上不会妨碍优化器并使事情变得更糟?/谢谢!
我是vagrant的新手,正在尝试向正在使用vagrant的虚拟机中添加第二个磁盘。我想出了在首次启动VM时如何附加磁盘的方法,但是当我关闭计算机然后再次备份(使用“ vagrant up --provision”以确保配置程序运行)时,我对磁盘所做的更改迷路了。
我同时运行了两次日志记录,并且第二次运行的日志输出(最初设置机器后的重新启动)显示正在执行storageattach命令。但是我在“ / dev / shm”(似乎是第二张磁盘的安装点)下创建的每个文件都消失了。
故障模式为:
流浪...
touch /dev/shm/some.file
ls /dev/shm/some.file # see output here...
Run Code Online (Sandbox Code Playgroud)
无业游民停止
无所事事
ls /dev/shm/some.file # no such file or directory.. where did it go ?
Run Code Online (Sandbox Code Playgroud)
任何提示将不胜感激。
我的Vagrantfile是:
...
Vagrant.require_version ">= 1.4.3"
VAGRANTFILE_API_VERSION = "2"
disk = './secondDisk.vdi'
BOX_NAME="test"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define :master do |master|
master.vm.box = "centos65"
master.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box"
master.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", "4196"]
v.name = BOX_NAME
end
master.vm.network :private_network, ip: "192.168.33.10"
master.vm.hostname = BOX_NAME …Run Code Online (Sandbox Code Playgroud) 我有一个关于诡计的问题
new PrintWriter("/tmp/some.file") { write("file contents"); close }
Run Code Online (Sandbox Code Playgroud)
我从这篇有趣的帖子中学到了:Scala:在一个语句中将字符串写入文件
这项技术效果很好(对于测试代码),但是我对Scala中语法上发生的事情感到有些困惑.
PrintWriter是一个java类......但它看起来像是一个代码块被传递给print writer实例,并且隐式地在该实例上执行方法调用.PrintWriter java类定义没有带有功能块的apply()方法.
那么..我很困惑签证vi Scala的语法
谢谢 !
我在Mac上运行selenium时遇到问题,因此它运行一个简单的套件,只需一个简单的测试(参见下面的"TEST CASE"和"TEST SUITE"部分),使用以下命令行:
Java的罐子LIB /硒的server.jar -timeout 10 -log的server.log -browserSideLog browser.log -debug -htmlSuite '*火狐' http://google.com `pwd`/suite3`pwd`/selenium.html
我的问题是,当测试失败时,我没有得到预期的非零返回码,而且,我没有看到任何报告.
我尝试了以下变种:
使用给定的套件和测试用例文件:
指定-timeout选项(大量结束而不写入报告),或
不要指定-timeout选项.没有超时选项,selenium服务器永远不会关闭...即使帮助文档说:
Run a single HTML Selenese (Selenium Core) suite and then exit
immediately, using the specified browser (e.g. "*firefox") on the
specified URL (e.g. "http://www.google.com").
Run Code Online (Sandbox Code Playgroud)为了解决问题,我在测试用例中添加了一个额外的selenium命令来强制关闭服务器,如下所示:
.... previous commands ...
<tr>
<td>open</td>
<td>http://localhost:4444/selenium-server/driver/?cmd=shutDownSeleniumServer</td>
<td></td>
</tr>
</tbody>
</table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这确实消除了悬挂.浏览器关闭,进程终止..但我没有测试结果,我的退出代码是(错误地)零...不是非零,正如我所期望的那样.
TEST SUITE(需要使用名称'suite3'保存)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" …Run Code Online (Sandbox Code Playgroud) 我正在阅读一些较旧的Scala帖子以更好地理解类型类,我遇到了一个似乎非常有用的,但这个例子似乎已经过时了.
有人可以帮我找出正确的方法来做Phillipe的意图吗?这是代码
trait Default[T] { def value : T }
implicit object DefaultInt extends Default[Int] {
def value = 42
}
implicit def listsHaveDefault[T : Default] = new Default[List[T]] {
def value = implicitly[Default[T]].value :: Nil
}
default[List[List[Int]]]
Run Code Online (Sandbox Code Playgroud)
复制/粘贴并在REPL中运行时,我得到这个>
scala> default[List[List[Int]]]
<console>:18: error: not found: value default
default[List[List[Int]]]
^
Run Code Online (Sandbox Code Playgroud) 这个问题关于 com.jayway.awaitility.Awaitility。
我刚刚尝试了 Awaitility.await(),它似乎有一些奇怪的行为。在下面的测试方法中,如果我注释掉 testWithFuture() 并启用 testWithAwaitility(),我永远不会看到打印出消息“end”。我看到“开始”,然后程序就退出了,似乎永远不会到达第二个打印语句。
因此,作为一种解决方法,我决定使用 Settable{Future} .. 如果其他人有同样的问题,那么我提供的解决方法可能会有用.. 更好的是得到一个很好的答案 ;^) !提前致谢/克里斯
编码:
import com.google.common.util.concurrent.SettableFuture;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static com.jayway.awaitility.Awaitility.await;
import static java.util.concurrent.TimeUnit.SECONDS;
public class AwaitTest {
static volatile boolean done = false;
public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
testWithFuture();
//testWithAwaitility();
}
private static void testWithAwaitility() {
System.out.println("start " + new Date());
new Thread(new Runnable(){
public void run(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) { …Run Code Online (Sandbox Code Playgroud) stackoverflow的同事们帮助我弄清楚了如何在ubuntu开发机器上确定特定的cloudera版本。(dpkg -l | grep cdh)。
现在,我想摸索这些资源,但是我不确定该去哪里下载它们。假设我要下载hdfs来源(带有适用于cdh5.3.0的cloudera mods):
dpkg显示的版本是:
hadoop-hdfs 2.5.0 + cdh5.3.0 + 781-1.cdh5.3.0.p0.54〜precise
现在,如果我转到此github存储库:https : //github.com/cloudera/hadoop-hdfs 我看不到任何包含字符串'5.3.0'的标签。
所以我被困在哪里看。任何指针将不胜感激。
我正在使用下面的docker-compose'recipe'来调出一个运行风暴流处理框架组件的容器.我在Mac上发现当我进入容器时(一旦它启动并运行docker exec -t -i <container-id> bash)ping storm-supervisor我就会得到错误'未知主机'.但是,当我在Linux上运行相同的docker-compose脚本时,主机被识别并且ping成功.
解析主机失败会导致Storm组件出现问题......但是对于这个问题,可以忽略该组件正在做什么.我很确定如果我弄清楚如何让Mac的docker-compose行为与Linux相匹配那么我就没问题了.
我想我遇到了这篇文章中提到的问题:https: //forums.docker.com/t/docker-compose-not-setting-hostname-when-network-mode-host/16728
version: '2'
services:
supervisor:
image: sunside/storm-supervisor
container_name: storm-supervisor
hostname: storm-supervisor
network_mode: host
ports:
- "8000:8000"
environment:
- "LOCAL_HOSTNAME=localhost"
- "NIMBUS_ADDRESS=localhost"
- "NIMBUS_THRIFT_PORT=49627"
- "DRPC_PORT=49772"
- "DRPCI_PORT=49773"
- "ZOOKEEPER_ADDRESS=localhost"
- "ZOOKEEPER_PORT=2181"
Run Code Online (Sandbox Code Playgroud)
提前感谢任何线索或提示!
我一直在尝试隐式转换,而且我对使用这些转换的'enrich-my-libray'模式有了很好的理解.我试图将我对基本隐含的理解与隐含证据的使用结合起来......但我误解了一些关键的东西,如下面的方法所示:
import scala.language.implicitConversions
object Moo extends App {
case class FooInt(i: Int)
implicit def cvtInt(i: Int) : FooInt = FooInt(i)
implicit def cvtFoo(f: FooInt) : Int = f.i
class Pair[T, S](var first: T, var second: S) {
def swap(implicit ev: T =:= S, ev2: S =:= T) {
val temp = first
first = second
second = temp
}
def dump() = {
println("first is " + first)
println("second is " + second)
}
}
val x = new Pair(FooInt(200), …Run Code Online (Sandbox Code Playgroud) scala ×6
typeclass ×2
apache-spark ×1
catalyst ×1
cloudera ×1
concurrency ×1
dataset ×1
docker ×1
fibonacci ×1
hadoop ×1
hdfs ×1
implicit ×1
implicits ×1
inputstream ×1
iterator ×1
java ×1
macos ×1
networking ×1
overriding ×1
performance ×1
selenium ×1
syntax ×1
unit-testing ×1
vagrant ×1
virtualbox ×1