这是我到目前为止所得到的:
Optional<Foo> firstChoice = firstChoice();
Optional<Foo> secondChoice = secondChoice();
return Optional.ofNullable(firstChoice.orElse(secondChoice.orElse(null)));
Run Code Online (Sandbox Code Playgroud)
这让我觉得既丑陋又浪费.如果firstChoice存在,我不必要地计算secondChoice.
还有一个更高效的版本:
Optional<Foo> firstChoice = firstChoice();
if(firstChoice.isPresent()) {
return firstChoice;
} else {
return secondChoice();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我无法将一些映射函数链接到最终,而无需复制映射器或声明另一个局部变量.所有这些使得代码比实际解决的问题更复杂.
我宁愿写这个:
return firstChoice().alternatively(secondChoice());
Run Code Online (Sandbox Code Playgroud)
但是Optional ::或者显然不存在.怎么办?
注意:我是一个一般经验丰富的程序员,使用 clojure,但从未做过认真的 web 开发。
我使用 Chestnut 设置了一个基本的 ClojureScript 项目,并很好地完成了“Hello World”步骤。但是,我也很想与我的后端交谈。为此,我将试剂代码重新定义为
(defn greeting []
[:input {:type "button"
:value (:text @app-state)
:on-click #(http/get {})}])
Run Code Online (Sandbox Code Playgroud)
单击时会收到 404 响应。所以至少我在和某人说话。我还可以在 server.log 文件中看到我的获取请求的证据。然而,在这一点上,我正在努力解决一些概念上的问题。
首先,http/get 是在 clj-http.client 中定义的一个函数,它不是 Chestnut 设置的一部分。如果我必须去寻找图书馆来发送像 get-request 这样基本的东西,感觉就像我已经偏离了轨道。
其次,用户命名空间的文件具有以下由 Chestnut 预定义的行:
(def http-handler
(wrap-reload #'mypage.server/http-handler))
(defn run []
(figwheel/start-figwheel!))
Run Code Online (Sandbox Code Playgroud)
我看不到任何使用过 http 处理程序的地方。所以我不明白这个定义到底是做什么的。
也是我理解 Figwheel 的方式,当我调用“run”时,它会启动一个新的 Web 服务器,然后 a) 提供 index.html 和 b) 通过某个 TCP 端口连接到我的浏览器并开始通过该连接抽取新的 JavaScript . 第二部分对我来说非常具有推测性。如果这真的发生了,我的下一个问题是 Figwheel 是否还需要位于该连接的另一端,或者浏览器是否具有一些允许从外部重新加载代码的通用 API。
最后,我可以说 mypage/server.clj 文件(如下)中定义的环路由和 http-handler 以某种方式被调用,因为修改这些更改了 get-request 中的错误,但是这对我来说完全是个谜这有效。根据我的理解,我从浏览器发送的 get-request 被发送到 Figwheel-server,即站点的来源。我没有理由相信 Figwheel 对我在服务器文件中定义的 …
不知何故,.idea文件夹中的文件已进入默认更改列表,每次我进行提交时,Intellij 都会询问我是否要在提交中包含该文件。
我不明白为什么 Intellij 坚持尝试对这个文件进行版本控制,或者我如何改变主意。
我试图让一个基本的reqwesthttp 请求像这样
extern crate reqwest;
extern crate url;
use url::Url;
fn main() {
let resp = reqwest::get("http://google.com".parse::<Url>().unwrap());
println!("{:?}", resp.unwrap())
}
Run Code Online (Sandbox Code Playgroud)
但是,这会产生错误
找不到 OpenSSL 安装目录,
-sys如果不了解此信息,此板条箱将无法继续。如果安装了 OpenSSL 并且此 crate 无法找到它,则可OPENSSL_DIR以为编译过程设置环境变量。确保您还安装了 openssl 的开发包。例如,
libssl-dev在 Ubuntu 或openssl-develFedora 上。...
嗯,这很容易解决。一个调用sudo apt install libssl-dev和sudo apt install pkg-config它的工作。但我仍然不明白这里到底出了什么问题。我认为cargo应该照顾依赖。为什么我现在要手动狩猎它们apt?
我经常处于我的代码如下所示的位置:
(iterate improve x)
Run Code Online (Sandbox Code Playgroud)
而且我正在寻找第一个不再比以前更好的价值.既不是filter也不take-while适合明显的解决方案.但是,我犹豫要写出来:
(loop [current x
next (improve x)]
(if (= current next)
current
(recur next (improve next))))
Run Code Online (Sandbox Code Playgroud)
要么:
(let [improvements (iterate improve x)]
(->> (map vector improvements (rest improvements))
(filter (partial apply =))
(ffirst)))
Run Code Online (Sandbox Code Playgroud)
因为在某些时候这变得重复,并且确定定点迭代是一项基本任务,某些地方必须有某种类型的库支持,对吧?
假设我正在调试代码,其中涉及的一个或多个函数是在memoize. 我将编辑一些代码,在 REPL 中重新加载文件,然后尝试新代码。但如果错误仍然存在,我总是怀疑是因为我还没有修复错误还是因为memoize缓存了错误结果。
那么,除了重新启动 REPL 之外,是否有某种方法可以用来绝对确保 REPL 已memoize丢失内存?
(请注意,消除memoizeREPL 会话期间的调用既乏味,有时甚至不切实际,因为函数的性能可能严重依赖于记忆。)
我目前正在盯着以下代码的增强版本:
func embarrassing(data []string) []string {
resultChan := make(chan string)
var waitGroup sync.WaitGroup
for _, item := range data {
waitGroup.Add(1)
go func(item string) {
defer waitGroup.Done()
resultChan <- doWork(item)
}(item)
}
go func() {
waitGroup.Wait()
close(resultChan)
}()
var results []string
for result := range resultChan {
results = append(results, result)
}
return results
}
Run Code Online (Sandbox Code Playgroud)
这只是在想我的想法.所有这一切都可以用其他语言表达为
results = parallelMap(data, doWork)
Run Code Online (Sandbox Code Playgroud)
即使在Go中不能轻易做到这一点,是不是还有比上面更好的方法呢?