小编Seb*_*off的帖子

结合选项的最优雅方式是什么?

这是我到目前为止所得到的:

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 ::或者显然不存在.怎么办?

java optional java-8

32
推荐指数
4
解决办法
2万
查看次数

如何使用 ClojureScript 和 Figwheel 与后端通信?

注意:我是一个一般经验丰富的程序员,使用 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 对我在服务器文件中定义的 …

clojure ring clojurescript figwheel

5
推荐指数
1
解决办法
1200
查看次数

如何从 Intellij 默认更改列表中删除项目?

不知何故,.idea文件夹中的文件已进入默认更改列表,每次我进行提交时,Intellij 都会询问我是否要在提交中包含该文件。
我不明白为什么 Intellij 坚持尝试对这个文件进行版本控制,或者我如何改变主意。

git intellij-idea

5
推荐指数
2
解决办法
5122
查看次数

为什么 reqwest 需要安装 OpenSSL?

我试图让一个基本的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-devsudo apt install pkg-config它的工作。但我仍然不明白这里到底出了什么问题。我认为cargo应该照顾依赖。为什么我现在要手动狩猎它们apt

ssl openssl rust reqwest

5
推荐指数
1
解决办法
1227
查看次数

如何迭代直到Clojure中的一个固定点?

我经常处于我的代码如下所示的位置:

(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)

因为在某些时候这变得重复,并且确定定点迭代是一项基本任务,某些地方必须有某种类型的库支持,对吧?

iteration clojure fixed-point-iteration

2
推荐指数
1
解决办法
310
查看次数

Clojure 的 memoize 何时清除其缓存?

假设我正在调试代码,其中涉及的一个或多个函数是在memoize. 我将编辑一些代码,在 REPL 中重新加载文件,然后尝试新代码。但如果错误仍然存​​在,我总是怀疑是因为我还没有修复错误还是因为memoize缓存了错误结果。
那么,除了重新启动 REPL 之外,是否有某种方法可以用来绝对确保 REPL 已memoize丢失内存?

(请注意,消除memoizeREPL 会话期间的调用既乏味,有时甚至不切实际,因为函数的性能可能严重依赖于记忆。)

clojure memoization read-eval-print-loop

2
推荐指数
1
解决办法
852
查看次数

Go中令人难以置信的并行任务的惯用解决方案是什么?

我目前正在盯着以下代码的增强版本:

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中不能轻易做到这一点,是不是还有比上面更好的方法呢?

concurrency channel go goroutine

-2
推荐指数
1
解决办法
357
查看次数