小编Dan*_*son的帖子

将附加状态传递给 rust `hyper::service::service_fn`

我在将附加状态传递给我的服务函数时遇到问题,但我无法理清闭包中的生命周期。教程似乎都没有解决这个问题:

https://hyper.rs/

https://docs.rs/hyper/0.13.4/hyper/server/index.html

https://docs.rs/hyper/0.13.4/hyper/service/fn.make_service_fn.html

相关代码:

#[tokio::main]                                                                       
async fn main() {                                                               
    let addr = ([127, 0, 0, 1], 8080).into();                                   
    let db = Arc::new(Mutex::new(Slab::new()));                                 
    let server = Server::bind(&addr).serve(make_service_fn(|_conn| async {      
        let db = db.clone();                                                         
        Ok::<_, Infallible>(service_fn(move |req| serve_req(req, &db)))         
    }));                                                                             
    if let Err(e) = server.await {                                                   
        eprintln!("server error: {}", e)                                             
    }                                                                                
}
Run Code Online (Sandbox Code Playgroud)

错误:

   Compiling hyper-microservice v0.1.0 (/data/repos/rust/hyper-microservice)
error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
   --> src/main.rs:121:66
    |
121 |         Ok::<_, Infallible>(service_fn(move |req| serve_req(req, &db)))
    |                                                                  ^^^ …
Run Code Online (Sandbox Code Playgroud)

lifetime rust async-await hyper

7
推荐指数
1
解决办法
1751
查看次数

异步流 `hyper::body::Body` 到 Rust 中的文件

如何使用或特征从 a 流式传输hyper::body::Body到文件。似乎在 0.13.5 中无法创建,因此在如下代码片段中不可能从转换为:tokio::io::AsyncWriteExttokio::io::{AsyncRead,AsyncWrite}hyper::error::Errorstd::io::Errorhyper::error::Error

req.into_body().try_fold(file, |file, chunk| async move {
    file.write_all(chunk.as_ref()).await.map(|_| file)
});
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以做到这一点?

rust async-await hyper

5
推荐指数
0
解决办法
448
查看次数

compose(*)函数如何在Ruby中工作(来自Ruby编程语言)?

摘录Ruby编程语言:

module Functional
  def compose(f)
    if self.respond_to?(:arity) && self.arity == 1
      lambda {|*args| self[f[*args]] }
    else
      lambda {|*args| self[*f[*args]] }
    end
  end
  alias * compose
end

class Proc; include Functional; end
class Method; include Functional; end

f = lambda {|x| x * 2 }
g = lambda {|x, y| x * y}
(f*g)[2, 3] # => 12
Run Code Online (Sandbox Code Playgroud)

if/else子句中f和*f有什么区别?

ruby functional-programming

3
推荐指数
1
解决办法
703
查看次数

IdeaVIm仅适用于src而不是Jar文件

出于某种原因,我可以使用IdeaVim来导航我的源文本就好了; 但是,当我跳转到外部库中的java文件(已锁定)时,所有Vim快捷方式都会以某种方式关闭.我怎样才能让他们继续运作?我正在使用Intellij 14 CE.

intellij-idea ideavim

3
推荐指数
1
解决办法
242
查看次数

Haskell `回文 = 反向 &gt;&gt;= (==)`

有人可以解释一下 Haskell 中回文的这个函数是如何工作的:

palindrome :: Eq a => [a] -> Bool
palindrome = reverse >>= (==)

-- type declarations
reverse :: [a] -> [a]
>>= :: Monad m => m a -> (a -> m b) -> m b
(reverse >>=) :: ([a] -> [a] -> b) -> [a] -> b
(==) :: Eq a => a -> a -> Bool
Run Code Online (Sandbox Code Playgroud)

特别是,Monad 类型类在函数上的定义是如何工作的,以及它如何以某种方式将 (==) 的输入数量从两个列表减少到一个列表?

monads haskell functional-programming

3
推荐指数
1
解决办法
177
查看次数

`url_serde` 请求不相关的特征边界

使用serdeurl_serde板条箱,我收到错误提示我需要满足不相关的特征边界:

   Compiling ser v0.1.0 (/data/scratch/ser)
error[E0277]: the trait bound `for<'a> url_serde::Ser<'a, url::Url>: a::_::_serde::Serialize` is not satisfied
  --> src/b.rs:4:10
   |
4  | #[derive(Serialize, Deserialize)]
   |          ^^^^^^^^^ the trait `for<'a> a::_::_serde::Serialize` is not implemented for `url_serde::Ser<'a, url::Url>`
   | 
  ::: /home/danj/.cargo/registry/src/github.com-1ecc6299db9ec823/url_serde-0.2.0/src/lib.rs:77:46
   |
77 |     where S: Serializer, for<'a> Ser<'a, T>: Serialize
   |                                              --------- required by this bound in `url_serde::serialize`
   |
   = help: the following implementations were found:
             <url_serde::Ser<'a, std::option::Option<url::Url>> as a::_::_serde::Serialize>
             <url_serde::Ser<'a, url::Url> as a::_::_serde::Serialize>
             <url_serde::Ser<'a, url::host::Host<String>> as a::_::_serde::Serialize> …
Run Code Online (Sandbox Code Playgroud)

url rust serde

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

在C++中初始化对象数组时出错

当我运行试图初始化对象数组的代码,并且其中一个具有无效值时,它似乎不会调用构造函数,这将设置正确的默认值.下面的代码生成输出:

1
2
1528112104
Run Code Online (Sandbox Code Playgroud)

玩具代码:

#include <iostream>
using namespace std;

class BeeBoop
{
    public:
        static const int MIN_X = 1;
        static const int MAX_X = 2;
        BeeBoop(int x);
        int getX() { return x; }
        bool setX(int x);

    private:
        int x;
};

int main()
{
    BeeBoop boops[] =
    {
        BeeBoop(1),
        BeeBoop(2),
        BeeBoop(3)
    };

    for (int i = 0; i < 3; i++)
        cout << boops[i].getX() << endl;
}

BeeBoop::BeeBoop (int x)
{
    if(!setX(x))
        x = MIN_X;
}

bool BeeBoop::setX(int x)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ arrays initialization

0
推荐指数
1
解决办法
56
查看次数

如何在不将请求存储在临时文件中的情况下处理通过 HTTP 上传的大文件

我想向 golang 服务器提交一个带有大文件有效负载(最多几个 gbs)的 get 请求,而不是让它将多部分主体存储在文件系统上,然后将文件内容复制到缓冲区并转发它上,我想在请求的正文到达时将其转发到另一个服务(不存储任何内容)。这是一个修改后的(来自How can I receive an Uploaded file using a Golang net/http server?)非工作示例,用于发布请求:

func ReceiveFile(w http.ResponseWriter, r *http.Request) {
    var Buf bytes.Buffer
    file, header, err := r.FormFile("file")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    io.Copy(&Buf, file)
    // stream Buf to grpc server
    Buf.Reset()
    return
}
Run Code Online (Sandbox Code Playgroud)

http stream go

0
推荐指数
1
解决办法
1994
查看次数

golang 资源所有权模式(文件、连接、关闭权限)

在 golang 中管理资源所有权的正确方法是什么?假设我有以下内容:

db, err := sql.Open("mysql", "role@/test_db")
am := NewResourceManager(db)
am.DoWork()
db.Close()
Run Code Online (Sandbox Code Playgroud)

总是让调用函数维护关闭资源的所有权和责任是典型的吗?这对我来说感觉有点奇怪,因为在关闭后,am仍然保留一个引用,db如果我或其他人稍后不小心,可以尝试使用(我想这是延迟的情况;但是,如果我想将 ResourceManager 传am回从这个块,我什至如何正确推迟文件的关闭?我实际上希望它在这个块完成执行时保持打开状态)。我发现在其他语言中,我经常希望允许实例管理资源,然后在调用析构函数时将其清理干净,就像这个玩具 python 示例:

class Writer():
   def __init__(self, filename):
       self.f = open(filename, 'w+')

   def __del__(self):
       self.f.close()

   def write(value):
       self.f.write(value)
Run Code Online (Sandbox Code Playgroud)

不幸的是,golang 中没有析构函数。除了这样的事情,我不知道我会如何在 go 中做到这一点:

type ResourceManager interface {
   DoWork()
   // Close() ?
}

type resourceManager struct {
  db *sql.DB
}

func NewResourceManager(db *sql.DB) ResourceManager {
  return &resourceManager{db}
} 

db, err := sql.Open("mysql", "role@/test_db")
am := NewResourceManager(db)
am.DoWork()
am.Close()  // using method …
Run Code Online (Sandbox Code Playgroud)

resources resource-management go

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