我想使用Haskell函数
readFile :: FilePath -> IO String
Run Code Online (Sandbox Code Playgroud)
将文件的内容读入字符串.在文档中,我读到"文件是按需读取的,与getContents一样."
我不确定我完全理解这一点.例如,假设我写
s <- readFile "t.txt"
Run Code Online (Sandbox Code Playgroud)
执行此操作时:
length s
所有内容将被读取并且文件将被关闭).readFile
就会关闭与此调用相关联的文件句柄(自动).我的第三个陈述是否正确?那么,我可以在readFile
不关闭文件句柄的情况下调用吗?只要我没有消耗(访问)整个结果字符串,句柄是否会保持打开状态?
编辑
以下是有关我的疑虑的更多信息.假设我有以下内容:
foo :: String -> IO String
foo filename = do
s <- readFile "t.txt"
putStrLn "File has been read."
return s
Run Code Online (Sandbox Code Playgroud)
当putStrLn
执行时,我会(直觉地)期望
s
包含文件的全部内容t.txt
,如果不是这样的话:
s
时候putStrLn
执行包含什么?putStrLn
执行时文件句柄处于什么状态?putStrLn
执行的时间s
不包含文件的全部内容,实际上何时会读取此内容,何时关闭文件?此代码正确编译.它有一些未使用的代码警告,但现在没问题.
use std::collections::BTreeMap;
enum Object<'a> {
Str(String),
Int(i32),
Float(f32),
Vector(Vec<&'a Object<'a>>),
Prim(fn(State) -> State)
}
struct State<'a> {
named: BTreeMap<String, &'a Object<'a>>,
stack: Vec<Object<'a>>
}
impl<'a> State<'a> {
fn push_int(&mut self, x: i32) {
self.stack.push(Object::Int(x));
}
}
fn main() {
println!("Hello, world!");
let obj = Object::Str("this is a test".to_string());
}
Run Code Online (Sandbox Code Playgroud)
这段代码的重要部分是push_int
和stack: Vec<Object<'a>>
.
我正在尝试制作基于堆栈的VM.我想将状态传递给函数,函数可以从堆栈中取出东西,操作东西,然后将一些东西放回堆栈; 命名字段将保存命名对象.
我有一种预感,将堆栈表示为Vec<&'a Object<'a>>
替代会更好.我现在拥有它的方式,我担心我会犯一些效率低下的错误.我的预感是正确的吗?
问题的第二部分是我不知道如何使引用版本的矢量工作.以适当的生命周期创建新值以推入堆栈对我来说不起作用.
我对这个问题有点模糊,所以如果我一直不清楚,请问我问题以清除问题.
我认为这对于那些想在工作中使用Cargo with Windows的人来说是一个非常普遍的问题; 我看过多个与它相关的GitHub问题和论坛帖子,但没有一个答案解决了我的问题.
每当我尝试构建一些指向crates.io包的代码时,我都会收到以下错误:
Downloading <package>
error: unable to get packages from source
Caused by:
failed to download package <package> from <package address>
Caused by:
SSL connect error
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?我知道Cargo可以使用设置,.cargo/config
并且代理详细信息可以包含在那里,但它不适用于我,无论是否指定证书的路径(我使用的是curl分发的路径),如下所示:
[http]
proxy = "http://user:password@proxy-address.xyz:port"
cainfo = "cert.pem"
[https]
proxy = "https://user:password@proxy-address.xyz:port"
cainfo = "cert.pem"
Run Code Online (Sandbox Code Playgroud)
配置文件中指定的代理适用于任何其他目的.
我正在使用Windows 7 64bit,Rust 1.11 GNU和Cargo捆绑它.我怎样才能使这个工作?目前,我不得不从他们的存储库中手动下载包来源paths = [...]
,并在Cargo配置文件中指定每个来源.
我是Haskell的新手,并尝试制作拼字游戏解算器.它接收您当前拥有的字母,查找它们的所有排列并过滤掉那些字典单词.代码非常简单:
import Data.List
main = do
dict <- readFile "words"
letters <- getLine
let dictWords = words dict
let perms = permutations letters
print [x | x <- perms, x `elem` dictWords]
Run Code Online (Sandbox Code Playgroud)
然而,与我使用Python的非常类似的实现相比,它的速度非常慢.有什么根本我做错了吗?
*编辑:这是我的Python代码:
from itertools import permutations
letters = raw_input("please enter your letters (without spaces): ")
d = open('words')
dictionary = [line.rstrip('\n') for line in d.readlines()]
d.close()
perms = ["".join(p) for p in permutations(letters)]
validWords = []
for p in perms:
if p in dictionary: validWords.append(p)
for validWord in …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用条件编译语句。除了定义一个只应存在于调试版本中的函数之外,我想定义一组仅存在于调试版本中的变量/常量/类型。
#[cfg(debug)]
pub type A = B;
pub type B = W;
#[cfg(other_option)]
pub type A = Z;
pub type B = I;
let test = 23i32;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,条件编译属性实际上“覆盖”了多少行?它只有一个(在这种情况下我会期望什么)?有没有办法确保整个代码块(包括变量、类型和两个函数)都被条件覆盖?
根据我对生命周期的理解,如果函数的调用者在参数上指定生命周期,我可以返回具有该生命周期的类型。
即使有省略,这也是有效的:
pub fn substr(s: &str) -> &str {
&s[0..1]
}
pub fn substr_ex<'a>(s: &'a str) -> &'a str {
&s[0..1]
}
Run Code Online (Sandbox Code Playgroud)
但这并没有:
use std::fmt::Arguments;
pub fn as_format_arg<'a, T: 'a + ?Sized + Debug>(t: &'a T) -> Arguments<'a> {
format_args!("{:?}", t)
}
Run Code Online (Sandbox Code Playgroud)
pub fn substr(s: &str) -> &str {
&s[0..1]
}
pub fn substr_ex<'a>(s: &'a str) -> &'a str {
&s[0..1]
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?还是我对生命的理解有误?
婴儿围栏:https://play.rust-lang.org/ ?gist=5a7cb4c917b38e012f20c771893f8b3b&version=nightly
我需要Vec
在FFI中传递一些元素.通过实验,我发现了一些有趣的观点.我开始给FFI所有3 ptr
,len
和capacity
这样我就可以重建Vec
后销毁它:
let ptr = vec.as_mut_ptr();
let len = vec.len();
let cap = vec.capacity();
mem::forget(vec);
extern_fn(ptr, len, cap);
// ...
pub unsafe extern "C" fn free(ptr: *mut u8, len: usize, cap: usize) {
let _ = Vec::from_raw_parts(ptr, len, cap);
}
Run Code Online (Sandbox Code Playgroud)
我想摆脱capacity
它,因为它对我的前端没用; 它只是为了让我可以重建我的矢量来释放记忆.
Vec::shrink_to_fit()
这很有吸引力,因为它似乎消除了处理能力的需要.不幸的是,关于它的文档并不能保证它会产生len == capacity
,因此我认为在期间from_raw_parts()
可能会触发未定义的行为.
into_boxed_slice()
似乎有一个保证,它将len == capacity
从文档中产生,所以我接下来使用它.如果我错了,请纠正我.问题是它似乎不能保证不重新分配.这是一个简单的程序:
fn main() {
let mut v = Vec::with_capacity(1000);
v.push(100u8); …
Run Code Online (Sandbox Code Playgroud) 正如The Book所建议的那样,我已将板条箱中的集成测试移动到一个tests
目录中。但是,其中一些测试使用了我不想导出到 crate 之外的函数,而且我无法再在集成测试文件夹中使用它们。我也将它们用于非测试目的,因此它们也需要在测试之外进行编译。我尝试使用 的变体pub(restricted)
,但无法使其工作。理想情况下,我想要像pub(tests)
.
目录树(相关位):
my_crate
|- src
|- parser.rs
|- tests
|- parsing.rs
|- benches
|- parsing.rs
Run Code Online (Sandbox Code Playgroud)
测试/解析.rs:
extern crate my_crate;
use my_crate::parser::foo;
#[test]
fn temp() {
foo();
}
Run Code Online (Sandbox Code Playgroud)
长凳/解析.rs:
#![feature(test)]
extern crate test;
extern crate my_crate;
use test::Bencher;
use my_crate::parser::foo;
#[bench]
fn temp(b: &mut Bencher) {
b.iter(|| { foo(); });
}
Run Code Online (Sandbox Code Playgroud)
我目前的解决方法是pub
在文档 ( #[doc(hidden)]
)中使相关对象保持可见和不可见,但这并没有传达正确的意图。我可以仅出于集成测试/基准测试的目的公开对象吗?
为什么我需要显式声明i32
一个数字的类型才能使用count_ones
它?
fn main() {
let x: i32 = 5;
println!("{}", x.count_ones());
}
Run Code Online (Sandbox Code Playgroud)
如果我写了let x = 5;
我会得到一个错误no method named 'count_ones' found for type '{integer}' in the current scope
.为什么不这样做?
考虑一个看起来像这样的Haskell数据类型
data MyData = MyData { arrInt :: [Int] , arrDouble :: [Double], arraySize :: N }
Run Code Online (Sandbox Code Playgroud)
这里N表示MyData记录的两个数组的大小.
是否可以将此(或MyData对象的某种Haskell"指针")传递给看起来像这样的C函数.
int myfunc (int* a, double* b, int N)
Run Code Online (Sandbox Code Playgroud)
我能够使用FFI来调用接受和返回简单数据类型的C函数,如Double,Int,Char等.但对于更复杂的类型,我不知道该怎么做.