刚刚找到Rust并阅读了文档的前两章,我发现他们定义语言的方法和方式特别有趣.所以我决定让我的手指湿润,开始使用Hello world ...
我在Windows 7 x64上这样做了,顺便说一下.
fn main() {
println!("Hello, world!");
}
Run Code Online (Sandbox Code Playgroud)
发行cargo build并查看结果targets\debug我发现所得.exe的存在3MB.经过一些搜索(很难找到货物命令行标志的文档......)我找到了--release选项并创建了发布版本.令我惊讶的是,.exe大小只变小了一小部分:2.99MB而不是3MB.
因此,承认我是Rust及其生态系统的新手,我的期望是系统编程语言会产生紧凑的东西.
任何人都可以详细说明Rust正在编译的内容,如何通过3个线程程序生成如此巨大的图像?它是否正在编译为虚拟机?我错过了一个strip命令(在发布版本中调试信息吗?)?还有什么可能让我们了解正在发生的事情?
虽然我基本了解它们之间是什么str以及std::string::String它们是如何相互关联的,但我发现从各个部分组成字符串而不花费太多时间和思考它有点麻烦.像往常一样,我怀疑我还没有看到正确的方法,这使它变得直观和轻而易举.
let mut s = std::string::String::with_capacity(200);
let precTimeToJSON = | pt : prectime::PrecTime, isLast : bool | {
s.push_str(
"{ \"sec\": "
+ &(pt.sec.to_string())
+ " \"usec\": "
+ &(pt.usec.to_string())
+ if isLast {"}"} else {"},"})
};
Run Code Online (Sandbox Code Playgroud)
上面的代码由编译器支持,错误消息如下:
src\main.rs:25:20:25:33错误:二进制操作
+无法应用于类型&'static str[E0369]
即使经过半个小时的摆弄和随机添加&,我也无法使这个可编辑.那么,我的问题在这里:
尝试编写一个返回计算机外部IP地址的模块.使用Network.Wreq get函数,然后应用镜头获取responseBody,我最终得到的类型是Data.ByteString.Lazy.Internal.ByteString.因为我想过滤掉结果体的尾随"\n",我想随后将它用于正则表达式.问题:regex库不接受看似非常具体的ByteString类型,我发现无法将其转换为String.
这是我到目前为止的微弱尝试(不编译).
{-# LANGUAGE OverloadedStrings #-}
module ExtIp (getExtIp) where
import Network.Wreq
import Control.Lens
import Data.BytesString.Lazy
import Text.Regex.Posix
getExtIp :: IO String
getExtIp = do
r <- get "http://myexternalip.com/raw"
let body = r ^. responseBody
let addr = body =~ "[^\n]*\n"
return (addr)
Run Code Online (Sandbox Code Playgroud)
所以我的问题很明显:如何将有趣的特殊ByteString转换为String?解释我如何自己处理这样的问题也是值得赞赏的.我试图用unpack和toString,但不知道该怎么导入如果它们存在让这些功能.
作为一个非常零星的haskell用户,我也想知道是否有人可以向我展示定义这样一个函数的惯用的haskell方式.毕竟,我在这里展示的版本没有考虑可能的运行时错误/异常.
在C++中,您可以使用类似的东西__clang_version__.Rust有类似的东西吗?我在互联网上搜索,但一无所获.
试图找到有关细节的文档,我没有发现很多东西:
对我来说,这留下了许多不清楚的事情.
原子字值是否始终相同,与序列模块加载到运行时实例无关?如果模块A和B都定义/引用一些原子,那么原子的值会在会话之间发生变化,这取决于是先加载A还是B?
当匹配模块内的原子时,是否存在一些"原子文字到原子值"的分辨率?模块是否有一些自己的模块本地原子值查找表,它在模块的加载时填充?
在2个erlang运行时实例相互通信的分布式场景中.是否有一些"sync-atom-tables"动作正在进行?或者将原子序列化为字符串文字,而不是单词?
使用 Rust 1.11 和 Cargo 1.12(每晚),我试图创建一个[workspace]包含一些库和一些可执行文件的。
在我的根文件夹中,我添加了我的子板条箱:
cargo new loader
cargo new shell --bin
Run Code Online (Sandbox Code Playgroud)
然后我将cargo.toml下面显示的内容添加到我的根文件夹中。
cargo new loader
cargo new shell --bin
Run Code Online (Sandbox Code Playgroud)
cargo build在我的根文件夹中运行会产生:
Run Code Online (Sandbox Code Playgroud)[package] name = "rustenv" version = "0.1.0" authors = ["ME"] [workspace] members = [ "loader" , "shell" ]
[workspace]鉴于我本质上是 Visual Studio 用户,我对此功能应该如何工作感到有些困惑,在那里,我可以简单地将项目添加到工作区。看来我还需要与 Cargo 做一些其他事情才能获得相同的效果。
第一次玩 Rusts clap crate。我想知道当命令行未指定选项时如何使用命令行选项的默认值。
鉴于我default_value在 yaml 文件中指定了 a(请参见下面的代码片段),matches.value_of("VERBOSE")如果命令行中没有给出其他值,我希望返回默认值。
相反,我得到:
Option::unwrap()线程“main”因“调用值”而惊慌失措None,src/main.rs:18:6
我在谷歌上搜索了一段时间,但似乎没有人真正给出一个规范的例子来说明它应该如何工作。
...
args:
- config:
short: c
long: config
value_name: CONFIG
help: Specifies the config file to use.
takes_value: true
default_value: ""
- verbose:
short: v
long: verbose
value_name: VERBOSE
help: Sets verbosity. 0 = silent, > 0 = verbose.
takes_value: true
default_value: "1"
Run Code Online (Sandbox Code Playgroud)
在这里,我无力的尝试......编译但不起作用(如果使用空命令行会出现恐慌)。
// ...
let yaml = load_yaml!("cli.yml");
let matches = App::from_yaml(yaml).get_matches();
let verbosity =
matches.value_of("VERBOSE")
.and_then(|s| s.parse::<u8>().ok())
.unwrap();
Run Code Online (Sandbox Code Playgroud)
由于这显然不使用默认值,我的简单问题是:我该如何做?
typedef std::function<bool(int)> MyFunction;
Run Code Online (Sandbox Code Playgroud)
那个bool(int)模板参数表示法语法 - 它有一个名字吗?我试图阅读有关此语法的C++标准,并且不知道要搜索什么.
显然,在其他环境中使用它似乎失败了.
typedef bool(int) MyFunctionType; // does not work.
Run Code Online (Sandbox Code Playgroud)
所以我假设有一个特殊的章节关于这个语法...
谢谢.
我刚刚想到,F#泛型似乎不接受常量值作为"模板参数".
假设有人想创建一个类型RangedInt,它的行为类似于int,但保证只包含一个整数值的子范围.
可能的方法可能是受歧视的联盟,类似于:
type RangedInt = | Valid of int | Invalid
Run Code Online (Sandbox Code Playgroud)
但这也不起作用,因为没有"范围信息的类型特定存储".如果范围不同,2个RangedInt实例应该是不同类型的.
仍然有点C++出没,它看起来类似于:
template<int low,int high>
class RangedInteger { ... };
Run Code Online (Sandbox Code Playgroud)
现在问题出现了两个问题:
RangedInt<int,int>在F#中实现这样一个惯用的方法是什么?找到Tomas Petricek关于自定义数字类型的博客,相当于我对该博客文章的问题将是:如果他不是IntegerZ5一个IntegerZn<int>自定义类型系列怎么办?
在语言之间跳跃可能会很痛苦.一种语言的习语"感觉很好",并且开始在其他语言中寻找相同的习语.
在F#中,有一种方法可以在生成器函数的帮助下初始化数组.Array.init n generator.现在,我跳到Rust一段时间,我想知道是否有类似的设施或者我是否必须创建自己这样的设施.
研究关于向量的Rust标准库文档,我找不到类似于我正在寻找的东西.
// Looking for something similar to:
Vec<T>::init(n : usize, generator : F) -> Vec<T>
where F: Fn(usize) -> T {
// ...
}
Run Code Online (Sandbox Code Playgroud)
也许它通过迭代器在Rust中的工作方式不同.但我必须承认,Rust迭代器(以及它们无数的味道)对我的简单思想来说仍然有点模糊.