在下面的示例中,我更倾向于在字段声明中为结构中的每个字段分配一个值.或者,它有效地为每个字段添加一个附加语句,以便为字段分配值.我想要做的就是在实例化结构时指定默认值.
有更简洁的方法吗?
struct cParams {
iInsertMax: i64,
iUpdateMax: i64,
iDeleteMax: i64,
iInstanceMax: i64,
tFirstInstance: bool,
tCreateTables: bool,
tContinue: bool,
}
impl cParams {
fn new() -> cParams {
cParams {
iInsertMax: -1,
iUpdateMax: -1,
iDeleteMax: -1,
iInstanceMax: -1,
tFirstInstance: false,
tCreateTables: false,
tContinue: false,
}
}
}
Run Code Online (Sandbox Code Playgroud) 我知道一般来说,应避免使用全局变量.尽管如此,我认为在实际意义上,有时需要(在变量是程序不可或缺的情况下)使用它们.
为了学习Rust,我目前正在使用sqlite3和GitHub上的Rust/sqlite3包编写数据库测试程序.因此,这需要(在我的测试程序中)(作为全局变量的替代),在大约有十几个函数之间传递数据库变量.一个例子如下.
在Rust中使用全局变量是否可行,可行和可取?
鉴于以下示例,我可以声明并使用全局变量吗?
extern crate sqlite;
fn main() {
let db: sqlite::Connection = open_database();
if !insert_data(&db, insert_max) {
return;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但它看起来不太正确并导致下面的错误(我也尝试了一个unsafe块):
extern crate sqlite;
static mut DB: Option<sqlite::Connection> = None;
fn main() {
DB = sqlite::open("test.db").expect("Error opening test.db");
println!("Database Opened OK");
create_table();
println!("Completed");
}
// Create Table
fn create_table() {
let sql = "CREATE TABLE IF NOT EXISTS TEMP2 (ikey INTEGER PRIMARY KEY NOT NULL)";
match DB.exec(sql) {
Ok(_) => println!("Table created"),
Err(err) => println!("Exec of …Run Code Online (Sandbox Code Playgroud) 使用数据库/ sql和驱动程序包以及Tx,它似乎无法检测事务是否已提交或回滚而不尝试另一个事务并因此接收错误,然后检查错误以确定类型错误.我希望能够从Tx对象确定是否已提交.当然,我可以在使用Tx的函数中定义和设置另一个变量,但我有很多它们,每次都是2次(变量和赋值).如果需要,我还有一个延迟函数来执行回滚,它需要传递bool变量.
在提交或回滚之后将Tx变量设置为nil是否可以接受,并且GC是否会恢复任何内存,或者是否为no-no,还是有更好的替代方案?
在搜索如何使用Rust生成随机数时,我遇到了以下示例.但是,它似乎没有用......示例似乎没有显示它适用于哪个版本的Rust,所以也许它已经过时了,或者我可能出错了.
// http://static.rust-lang.org/doc/master/std/rand/trait.Rng.html
use std::rand;
use std::rand::Rng;
fn main() {
let mut rng = rand::task_rng();
let n: uint = rng.gen_range(0u, 10);
println!("{}", n);
let m: float = rng.gen_range(-40.0, 1.3e5);
println!("{}", m);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,会产生以下结果:
test_rand002.rs:6:17: 6:39 error: type `@mut std::rand::IsaacRng` does not
implement any method in scope named `gen_range`
test_rand002.rs:6 let n: uint = rng.gen_range(0u, 10);
^~~~~~~~~~~~~~~~~~~~~~
test_rand002.rs:8:18: 8:46 error: type `@mut std::rand::IsaacRng` does not
implement any method in scope named `gen_range`
test_rand002.rs:8 let m: float = rng.gen_range(-40.0, 1.3e5);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
在同一页面(上面)上有另一个例子(如下所示)可以工作.然而,它并没有完全符合我的要求,尽管我可以适应它. …
我正在Win8上使用Rust 0.8编写测试程序,我需要使用数组/矢量/列表读取和写入程序使用的一些参数来访问/从文本文件中访问各行.
在花了相当多的时间试图找到有用的东西之后,我能找到的最接近的东西如下:
use std::rt::io::{file, Open};
use std::path::Path;
use std::rt::io::file::FileInfo;
fn main () {
let mut reader : file::FileReader = Path("xxxx.txt").open_reader(Open)
.expect("'xxxx.txt' could not be opened");
println("Completed");
}
Run Code Online (Sandbox Code Playgroud)
如果文件存在,上述"有效".
有人可以告诉我一个如何做我所说的要求的例子吗?
使用Go我试图找到将浮点数格式化为字符串的"最佳"方法.我找了一些例子但是找不到任何具体回答我的问题的东西.我想要做的就是使用"最佳"方法将浮点数格式化为字符串.小数位数可能会有所不同,但是已知(例如,2或4或零).我想要实现的一个例子如下.根据下面的例子,我应该使用fmt.Sprintf()或strconv.FormatFloat()还是其他什么?并且,每个的正常用法和每个之间的差异是什么?
我也不明白在下面使用32或64当前有32的重要性:
strconv.FormatFloat(float64(fResult), 'f', 2, 32)
Run Code Online (Sandbox Code Playgroud)
例:
package main
import (
"fmt"
"strconv"
)
func main() {
var (
fAmt1 float32 = 999.99
fAmt2 float32 = 222.22
)
var fResult float32 = float32(int32(fAmt1*100) + int32(fAmt2*100)) / 100
var sResult1 string = fmt.Sprintf("%.2f", fResult)
println("Sprintf value = " + sResult1)
var sResult2 string = strconv.FormatFloat(float64(fResult), 'f', 2, 32)
println("FormatFloat value = " + sResult2)
}
Run Code Online (Sandbox Code Playgroud) 我已经对例如货币处理进行了一些测试.去和飞镖.基本上,我认为处理货币的最佳方法是将双精度转换为整数,以便所有计算都是使用整数进行的,我认为这是可接受的方式.但是,不同的语言会将转换视为不同的整数.例如,Go截断双打因此,我认为有必要添加舍入因子来补偿.使用Rust,我发现执行直接转换(见下文)似乎有效,但我不确定Rust实际上如何处理转换使用似乎是处理转换的两种替代方法.
Rust如何处理f64到i64的舍入以及使用的最佳方法 - "as i64"或"to_i64()"?
基于我所做的时间,这里的两种方法看起来并不相同,但结果可能是.("因为i64"出现的速度略快).
示例(简化为仅使用2个小数位 - 单一货币):
fn fCcyDblToInt(dCcyAmt: f64) -> i64 {
// return (dCcyAmt * 100.0).to_i64();
return (dCcyAmt * 100.0) as i64;
}
Run Code Online (Sandbox Code Playgroud)
在做了一些更多的测试之后,以下对我来说是使用Rust处理float到整数的转换的方法:
fn fCcyDblToInt(dCcyAmt:f64) -> i64 {
let dRound: f64 = if dCcyAmt > 0.0 { 0.5 } else if dCcyAmt < 0.0 {-0.5 } else {0.0};
// return ((dCcyAmt * 100.0) +dRound).to_i64();
return ((dCcyAmt * 100.0) +dRound) as i64;
}
Run Code Online (Sandbox Code Playgroud)
我对此非常满意,因为这是我在其他地方处理它的方式,但是我会测试更多.
我发现Go中提供的命名返回变量是一个有用的特性,因为它可以避免单独声明一个或多个变量.但是,在某些情况下,我想将一个不同的变量返回给函数中声明的变量作为返回变量.这似乎工作正常,但我发现声明一个返回变量然后返回其他东西确实有点奇怪.
在编写测试程序以帮助学习Go(而不是下面的那个)时,我发现在返回多个变量的函数的return语句中指定返回变量有点烦人.特别是这样,因为变量已在函数声明中命名.我现在发现,在发布这个时,似乎在有命名的返回变量的地方,它们不需要在return语句中使用,只需"return"即可,并隐式使用命名变量.我发现这是一个很棒的功能.
所以,虽然我可能已经部分回答了我自己的问题,但有人可以建议我下面的用法是否可以接受?我确信这是有记录的,但我没有遇到它,它似乎不在我购买的参考书中,我认为忽略了这个功能.
基本上,规则似乎是(据我所知),在使用命名返回变量的地方,函数语句声明变量,并且函数可以选择隐式地将它们用作返回值,但是这可以是通过使用显式返回值来覆盖.
示例程序:
package main
func main() {
var sVar1, sVar2 string
println("Test Function return-values")
sVar1, sVar2 = fGetVal(1)
println("This was returned for '1' : " + sVar1 + ", " + sVar2)
sVar1, sVar2 = fGetVal(2)
println("This was returned for '2' : " + sVar1 + ", " + sVar2)
}
func fGetVal(iSeln int) (sReturn1 string, sReturn2 string) {
sReturn1 = "This is 'sReturn1'"
sReturn2 = "This is 'sReturn2'"
switch iSeln {
case 1 : …Run Code Online (Sandbox Code Playgroud) 使用go1.1.2 Win64,我有一个Go程序,它"编组"包含float64的结构.当float64的值不是整数时,例如.1234.44,然后它被"编组"为浮点数(json.Marshal).然而,当它是一个整数时,例如."1234.00"它被编组为整数"1234".当我在另一端(Dart)收到它时,Dart(30188)将整数视为整数(在地图中 - JSON.decode).因此,当float(double)数据的表示不包含小数点时,Dart程序将中止,并且我尝试将其从地图"提取"为double.
这显然可以通过许多不同的方式解决(例如,转换为整数然后转换回浮点数),但我想知道是否有另一种(更好的)方法来处理这种情况.
有没有比将float64转换为整数更好的方法来处理这个问题?
以下是相关代码。onFieldSubmitted: 中的 debugPrint() 正在运行,所以代码到了这里,但焦点没有改变。焦点不变。
_createItemHeadingWidget() {
return Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
controller: _controllerItemHed,
autofocus: true,
focusNode: _focusNodeItemHed,
textInputAction: TextInputAction.next,
onFieldSubmitted: (v) {
debugPrint("ItemHeading submitted");
FocusScope.of(context).requestFocus(_focusNodeItemDetail);
},
decoration: InputDecoration(
labelText: "Item Heading",
hintText: "Enter item heading",
border: OutlineInputBorder(borderRadius: BorderRadius.circular(20.0)),
),
),
);
}
Run Code Online (Sandbox Code Playgroud)
Widget _createItemDetailWidget() {
return Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
controller: _controllerItemDetail,
maxLength: 75,
focusNode: _focusNodeItemDetail,
textInputAction: TextInputAction.next,
onFieldSubmitted: (v) {
debugPrint("ItemDetail submitted");
FocusScope.of(context).requestFocus(_focusNodeItemPrice);
},
decoration: InputDecoration(
labelText: "Item Detail",
hintText: "Enter item detail",
border: OutlineInputBorder(borderRadius: …Run Code Online (Sandbox Code Playgroud)