我想知道是否可以在运行时从Nim中的值获取类型(int32/float64/string)?
我认为这可以通过"typeinfo"库实现,但我无法理解!
编辑:得到答案,并迅速做到这一点:
import typetraits
type
MyObject = object
a, b: int
s: string
let obj = MyObject(a: 3, b: 4, s: "abc")
proc dump_var[T: object](x: T) =
echo x.type.name, " ("
for n, v in fieldPairs(x):
echo(" ", n, ": ", v.type.name, " = ", v)
echo ")"
dump_var obj
Run Code Online (Sandbox Code Playgroud)
输出:
MyObject (
a: int = 3
b: int = 4
s: string = abc
)
Run Code Online (Sandbox Code Playgroud) 我扫描了Rust文档,以便在字符编码之间进行转换,但没有找到任何内容.我错过了什么?
是否由Rust语言及其标准库支持(直接或间接),甚至计划在不久的将来?
由于其中一个答案表明有一个简单的解决方案,因为u8可以转换为(Unicode)chars.Unicode是ISO-8859-1中代码点的超集,即1:1映射,它编码为UTF-8中的多个字节,这是StringRust 中s 的内部编码.
fn main() {
println!("{}", 196u8 as char);
println!("{}", (196u8 as char) as u8);
println!("{}", 'Ä' as u8);
println!("{:?}", 'Ä'.to_string().as_bytes());
println!("{:?}", "Ä".as_bytes());
println!("{}",'Ä' == 196u8 as char);
}
Run Code Online (Sandbox Code Playgroud)
得到:
Ä
196
196
[195, 132]
[195, 132]
true
Run Code Online (Sandbox Code Playgroud)
哪个我甚至没有考虑过工作!
我想显示具有任意类型的列表的内容,每行一个元素,从1开始编号,如下所示:
字符串示例:
> bs "Hallo"
1. 'H'
2. 'a'
3. 'l'
4. 'l'
5. 'o'
Run Code Online (Sandbox Code Playgroud)
整数示例
> bs [5,6,1,2]
1. 5
2. 6
3. 1
4. 2
Run Code Online (Sandbox Code Playgroud)
元组示例
> bs [(4,"Test"),(3,"Aye"),(5,"Fives")]
1. (4,"Test")
2. (3,"Ayes")
3. (4,"Fives)
Run Code Online (Sandbox Code Playgroud)
我发现这是一个解决方案:
bs' :: Show a => [a] -> Integer -> IO ()
bs' [] _ = return ()
bs' (x:xs) y = do
putStrLn $ (show y) ++ ". " ++ (show x)
bs' xs $ succ y
bs x = bs' x …Run Code Online (Sandbox Code Playgroud) 我目前正在阅读有关身份Monad的文章,其中一篇将fmap定义为:
fmap :: (a -> b) -> (W a -> W b)
fmap f (W x) = W (f x)
Run Code Online (Sandbox Code Playgroud)
文本说,目标是创建一个功能,将a和b类型的现有功能更改为将原始功能应用于Wa和w b的另一个功能。
从这个角度来看,涉及两个函数,类型签名也看起来像这样:它的参数是一个函数,并且提供了一个函数。
首先让我感到困惑的是,ghci告诉我们的fmap的实际类型是:
fmap :: (a -> b) -> W a -> W b
Run Code Online (Sandbox Code Playgroud)
对此进行的思考表明,函数fmap获取一个函数和类型为W a的参数,然后将该函数应用于Wa中的a上,并将结果返回为W b。恰好是fmap代码的功能描述。
我非常确定,如果在类型定义中省略了括号,那么函数的功能不会有任何区别。
我说对了,就像我会说的那样:
addab 是创建函数的函数,可以向其参数添加值
并给出以下示例代码:
addab :: Int -> (Int -> Int)
addab x y = x + y
add1 :: Int -> Int
add1 = addab 1
Run Code Online (Sandbox Code Playgroud)
基本上只是指示该函数是在没有提供所有参数的情况下使用的?
还是我没有考虑的更深层含义?
给出以下代码:
fn main() {
let vec = vec![0u8, 1, 2, 3, 4, 5, 6];
// find the first element > 3
println!("{}", vec.iter().find(|&x| *x > 3).unwrap());
// find the position of the first element > 3
println!("{}", vec.iter().position(|&x| x > 3).unwrap());
}
Run Code Online (Sandbox Code Playgroud)
并查看文档:
fn find<P>(&mut self, predicate: P) -> Option<<Self as Iterator>::Item>
fn position<P>(&mut self, predicate: P) -> Option<usize>
Run Code Online (Sandbox Code Playgroud)
我发现很难理解为什么find()需要*x和position()需要x.两者都有&mut self,它看起来好像在谓词中都做同样的工作.
我想这可以通过不同的返回类型推断出来,但具体的规则是什么?
我只想从 [1,2,3,4] 中的每个列表元素中减去 1,例如
map (-1) [1,2,3,4] -- does not work
map ((-)1) [1,2,3,4] -- gives [0,-1,-2,-3] which is "-listvalue" + 1
map (\x = x - 1) [1,2,3,4] -- what I want but so verbose
map (+ (-1)) [1,2,3,4] -- well :)
map (flip (-) 1) [1,2,3,4] -- I heard of flip before
(map . flip (-)) 1 [1,2,3,4] -- Kinda nice mapped substration composing thingy
map pred [1,2,3,4] -- OK cheated and won't help with -2
Run Code Online (Sandbox Code Playgroud)
我是否错过了“正确”的表格和/或 Haskell …
以下显然不起作用:
fn main() {
for i in range(1i, 101) {
println!("{}", if i % 15 == 0 {
"Fizzbuzz"
} else if i % 5 == 0 {
"Buzz"
} else if i % 3 == 0 {
"Fizz"
} else {
i
});
};
}
Run Code Online (Sandbox Code Playgroud)
它可以像这样工作:
fn main() {
for i in range(1i, 101) {
println!("{}", if i % 15 == 0 {
"Fizzbuzz".to_string()
} else if i % 5 == 0 {
"Buzz".to_string()
} else if i % …Run Code Online (Sandbox Code Playgroud)