小编eik*_*iko的帖子

在Rust中返回新字符串的正确方法

我只花了一个星期阅读Rust Book,现在我正在开发我的第一个程序,它将文件路径返回到系统壁纸:

pub fn get_wallpaper() -> &str {
    let output = Command::new("gsettings");
    // irrelevant code
    if let Ok(message) = String::from_utf8(output.stdout) {
        return message;
    } else {
        return "";
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误expected lifetime parameter on &str,我知道Rust想要一个输入&str,它将作为输出返回,因为&str我在函数内部创建的任何内容都将在函数结束后立即清理.

我知道我可以通过返回一个String而不是一个来回避这个问题&str,并且对类似问题的许多答案已经说了很多.但我似乎也可以这样做:

fn main() {
    println!("message: {}", hello_string(""));
}

fn hello_string(x: &str) -> &str {
    return "hello world";
}
Run Code Online (Sandbox Code Playgroud)

得到&str我的功能.有人可以向我解释为什么这很糟糕,为什么我不应该这样做?或者也许它在某些情况下并不坏并且没问题?

rust

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

错误:安装oj时出错:

我刚刚第一次从GitHub克隆了一个存储库.

我去了我的本地机器,所以在我的Mac上的本地存储库中运行以下命令

bin/rails服务器

我收到以下错误:

无法在任何源中找到activesupport-5.0.0.1运行bundle install以安装缺少的gem.

所以我按照建议运行了bundle install命令,但后来它给了我以下错误

安装oj(2.12.14)时发生错误,Bundler无法继续.gem install oj -v '2.12.14'在捆绑之前确保成功.

所以我按照建议运行:gem install oj -v'2.12.14'

然后我得到了一个非常长的消息,警告和错误(见下文).有什么想法吗?

ERROR:  Error installing oj:
ERROR: Failed to build gem native extension.

    current directory: /usr/local/lib/ruby/gems/2.4.0/gems/oj-2.12.14/ext/oj

/usr/local/opt/ruby/bin/ruby -r ./siteconf20170218-3717-1p2bvl9.rb extconf.rb

>>>>> Creating Makefile for ruby version 2.4.0 on x86_64-darwin16 <<<<<

creating Makefile



current directory: /usr/local/lib/ruby/gems/2.4.0/gems/oj-2.12.14/ext/oj

make "DESTDIR=" clean



current directory: /usr/local/lib/ruby/gems/2.4.0/gems/oj-2.12.14/ext/oj

make "DESTDIR="

compiling cache8.c

compiling circarray.c

compiling compat.c

compiling dump.c

dump.c:503:8: warning: implicit conversion loses integer precision: 'long' to …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails

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

如何判断KeyboardEvent.key是可打印字符还是控制字符?

我正在编写一个按键事件,该事件对某些控制字符执行特殊功能,但将任何可打印字符插入字符串中。

this.handle_keypress = function(event) {
    let callback = this.control_function[event.key];
    if(callback) {
        callback.bind(this)(event);
    }
    else {
        this.myText += event.key;
    }
}

this.element.addEventListener('keypress', this.handle_keypress.bind(this));
Run Code Online (Sandbox Code Playgroud)

但这会将未映射的控制字符的文本插入到我的字符串中(例如“LeftArrow”或“Backspace”)。如何判断哪些字符是可打印字符,哪些是控制字符?

过去,我会使用 event.which 或 event.charCode,但这些现在已标记为已弃用。

据我所知,我无法使用输入事件,因为我没有在文本区域或输入字段中输入内容。

我在 Firefox 中运行这个。

javascript

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

有没有办法在匹配中使用自定义模式,如正则表达式或函数?

我正在Rust写一个玩具编程语言.我在Ruby中构建了解析器逻辑原型:

def rd_tree(chars)
  loop do
    case c = chars.next
    when /\s/
      # whitespace stuff
    when "("
      # open paren stuff
    when ")"
      # close paren stuff
    else
      # default stuff
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我将它转换为Rust:

fn rd_tree(chars: std::str::Chars) {
    while let Some(c) = chars.next() {
        if c.is_whitespace() {
            // whitespace stuff
        } else if c == '(' {
            // open paren stuff
        } else if c == ')' {
            // close paren stuff
        } else {
            // default stuff
        }
    } …
Run Code Online (Sandbox Code Playgroud)

pattern-matching rust

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

添加内容时防止网格项扩展

我正在尝试创建一个布局,其中屏幕被分成一些大小相同的单元格。当我用内容填充其中一个单元格时,它会拉伸得比其他单元格大,即使内容比单元格本身小得多。

尽管单元格足够大以容纳其内容,但为什么单元格会拉伸?我怎样才能防止它调整大小?

html, body {
  margin: 0px;
  padding: 0px;
  width: 100%;
  height: 100%;
  background-color: #880022;
}

#content {
  display: grid;
  width: 100%;
  height: 100%;
  grid-template-rows: 20px auto 20px;
  grid-template-columns: 20px auto 20px;
}

#content2 {
  display: grid;
  grid-template-rows: auto;
  grid-template-columns: auto;
  height: 100%;
  background-color: #ff00ff;
}

#grid {
  grid-row-start: 2;
  grid-column-start: 2;
  display: grid;
  grid-template-rows: auto auto;
  grid-template-columns: auto auto;
  grid-gap: 2px 2px;
}

.tile {
  background-color: rgba(255, 255, 255, 0.2);
  display: flex;
  align-items: center;
  justify-content: center;
}

.tile span …
Run Code Online (Sandbox Code Playgroud)

html css grid-layout css-grid

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

Vue prop 在对计算函数的初始调用中未定义

我有以下 Vue 组件:

Vue.component('result', {
  props: ['stuff'],
  data: () => ({}),
  template: "<img :src='tag' class='result'></img>",
  computed: {
    tag: function tag() {
      return `pages/search/img/${this.stuff.type.toLowerCase()}_tag.png`;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

创建组件时,会抛出错误:

TypeError: Cannot read property 'toLowerCase' of undefined
  at VueComponent.tag
Run Code Online (Sandbox Code Playgroud)

但是,当我删除对 的调用时toLowerCase(),该方法会正确执行,生成具有预期类型的​​字符串。我可以通过将文件名更改为大写字母来解决这个问题,但我更愿意理解为什么 Vue 会这样。为什么只有在调用属性的方法时属性才会未定义?

更新:经过一些故障排除后,我发现this.stuff.type第一次tag()计算时未定义。调用toLowerCase()只会强制一个原本无声的错误发生错误。第一次调用函数props时未定义是否有原因?computed我应该以不同的方式编写我的组件吗?

javascript vue.js

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

安全导航操作符(孤独操作符)不适用于哈希

我正在尝试使用安全导航运算符&来选择调用[]变量上的方法,该变量可能是散列或nil. 据我所知,这就是安全导航操作员的用途。

my_hash = nil
puts "hello, #{ my_hash&[:test] }"
my_hash = { test: "world" }
puts "hello, #{ my_hash&[:test] }"
Run Code Online (Sandbox Code Playgroud)

我期望输出:

hello, false
hello, world
Run Code Online (Sandbox Code Playgroud)

但它不适用于哈希;相反,我得到:

hello, false
undefined method `&` for `{:test=>"world"}:Hash` (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

ruby

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

防止网格区域扩展导致整个页面滚动

我正在使用以下网格布局:

grid-template-columns: 10em 1fr 10em;
grid-template-rows: 2em 1fr 2em;
Run Code Online (Sandbox Code Playgroud)

创建一个充满屏幕大部分区域的居中区域,同时在屏幕周围保留一些填充。在此1fr x 1fr网格区域内是一个panediv,其中包含一个editordiv,该div中包含一个contentdiv。

contentDIV可以是任意高度,editorDIV已overflow: scroll设置。我的问题是,不是pane保持相同的大小并editor处理溢出,而是pane增长并导致整个页面滚动。

我可以pane通过设置它来避免增长overflow: scroll,但这会导致编辑器本身滚动而不是滚动。这是不可接受的,因为编辑器的按钮必须始终显示在屏幕上。

在网格布局中,是否有办法允许此功能?我最初使用的是flex布局,其中panediv是100% x 100%flexbox中的单个项目。我改用网格以方便地调整侧面菜单的大小,因此在不使用网格的情况下实施此方法不是可取的。

另外,多浏览器支持将是惊人的,但是我的目标浏览器是Chrome。

这是我重现我的问题的一个技巧。

grid-template-columns: 10em 1fr 10em;
grid-template-rows: 2em 1fr 2em;
Run Code Online (Sandbox Code Playgroud)
body, html {
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
}

#site {
  width: 100%;
  height: 100%;
  background-color: #000;
  
  display: grid;
  grid-template-rows: …
Run Code Online (Sandbox Code Playgroud)

html css css3 flexbox css-grid

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

为什么 Weak::new() 不起作用,而 Rc::downgrade() 起作用?

我正在创建一个返回Weak对特征对象的引用的函数。在找不到对象的情况下(它是一个查找函数),我想Weak使用以下方法返回一个空引用Weak::new()

use std::rc::{self, Rc, Weak};
use std::cell::RefCell;

pub trait Part {}

pub struct Blah {}

impl Part for Blah {}

fn main() {
    let blah = Blah {};
    lookup(Rc::new(RefCell::new(blah)));
}

fn lookup(part: Rc<RefCell<Part>>) -> Weak<RefCell<Part>> {
    if true {
        Rc::downgrade(&part)
    } else {
        Weak::new()
    }
}
Run Code Online (Sandbox Code Playgroud)

这样在编译的时候会出现如下错误:

use std::rc::{self, Rc, Weak};
use std::cell::RefCell;

pub trait Part {}

pub struct Blah {}

impl Part for Blah {}

fn main() {
    let blah = Blah {}; …
Run Code Online (Sandbox Code Playgroud)

rust

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

如何访问Rust目录中的文件?

我写了一个基于Rust文档的非常简单的脚本:

use std::fs::{self, DirEntry};
use std::path::Path;

fn main() {
    let path = Path::new(".");
    for entry in fs::read_dir(path)? {
        let entry = entry?;
        let path = entry.path();
        if path.is_dir() {
            println!("directory found!");
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

但我得到以下编译错误?:

error[E0277]: the trait bound `(): std::ops::Carrier` is not satisfied
 --> test.rs:6:18
  |
6 |     for entry in fs::read_dir(path)? {
  |                  -------------------
  |                  |
  |                  the trait `std::ops::Carrier` is not implemented for `()`
  |                  in this macro invocation
  |
  = note: required …
Run Code Online (Sandbox Code Playgroud)

rust

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