type MyObject string
var objects []MyObject
Run Code Online (Sandbox Code Playgroud)
我想对这些对象进行排序.标准库有sort.Strings,但需要一个实例[]string而不是[]MyObject.
我目前的解决方案是实现sort.Interface(如下所示)并使用sort.Sort,但我想摆脱那个样板代码.有更好的方法吗?
type MyObjects []MyObject
func (objs MyObjects) Len() int {
return len(objs)
}
func (objs MyObjects) Less(i, j int) bool {
return strings.Compare(string(objs[i]), string(objs[j])) < 0
}
func (objs MyObjects) Swap(i, j int) {
o := objs[i]
objs[i] = objs[j]
objs[j] = o
}
Run Code Online (Sandbox Code Playgroud) 我正在研究我的第一个实际的Rust程序,一个自定义的i3status.它很顺利,但有两个地方我必须处理,Result<T>而且Option<T>代码看起来非常难看,让我相信我错过了一些语言功能或库函数来更清晰地编写这些部分.
这是有问题的文件,但我会在这里引用相关部分.第一个是:
fn read_number_from_file(path: &str) -> Option<i64> {
let mut file = match File::open(path) {
Ok(f) => f,
Err(_) => return None,
};
let mut contents = String::new();
match file.read_to_string(&mut contents) {
Ok(_) => {},
Err(_) => return None,
};
match contents.trim().parse::<i64>() {
Ok(val) => Some(val),
Err(_) => None,
}
}
Run Code Online (Sandbox Code Playgroud)
这里吞咽错误信息是故意的.i3status没有stderr,所以我所能做的就是跳过渲染损坏的部分.
无论如何,这段代码看起来很丑陋,重复使用它match来丢弃Err值.我尝试?通过使返回类型为a 来使用new 运算符std::io::Result<i64>,但str::parse返回不同类型的错误,因此AFAICS不起作用.因此,我选择Option<i64>了最低标准.
第二个丑陋的部分是使用此函数的地方:
let energy_full = match read_number_from_file(ENERGY_FULL_PATH) {
Some(val) …Run Code Online (Sandbox Code Playgroud) 我有一个函数调用其他几个函数,例如
sub do_work {
send_mail();
send_soap_envelope();
send_rpc();
}
Run Code Online (Sandbox Code Playgroud)
被调用的函数可能会挂起,所以我希望在超时后停止它们.我想避免分叉,因为它在我的上下文中很昂贵(例如,在每个fork之后需要重新创建数据库句柄).我想出了以下方案:
sub timeout {
my ($code) = @_;
eval {
alarm 2;
local $SIG{ALRM} = sub { die 'timeout' };
&$code;
alarm 0;
};
# handling of $@ eq 'timeout' removed for brevity
}
sub do_work {
timeout \&send_mail;
timeout \&send_soap_envelope;
timeout \&send_rpc;
};
Run Code Online (Sandbox Code Playgroud)
该timeout()函数(在此示例中硬编码为2秒的超时)使用eval块作为使用中止有效载荷函数的执行的手段die.
这在我的测试场景中工作正常,但是如果die在Perl解释器未处于"安全状态"时中断有效负载功能,例如在处理XS子例程时,我会感到不安.我的直觉是对的吗?
我非常喜欢使用Firebug来调试我的JavaScript代码,HTML DOM和网络加载,即:客户端关于Web开发的所有内容.
服务器端的情况并不那么明亮.我正在使用的应用程序使用Perl和强制性标准模块,如CGI和DBI.我知道标准的故障排除技术,但似乎没有跟踪例如数据库查询或函数调用的调试工具,并给我很好的输出.
输出必须特别不仅仅是在STDOUT(想象Content-Type: application/json)或STDERR(通过错误日志进行捣乱非常不舒服)被拉动,并且该工具不应该要求我手动将填充物填充到核心模块中或者use Data::Dumper; print '<pre>',Dumper($foo),'</pre>'在整个代码中喷洒.
长话短说:是否有一个工具可以让Perl/CGI的服务器端调试像Firebug在客户端那样有趣?
在Perl中,我经常发现自己使用以下模式:
croak "incompatible object given: $object"
unless $object->isa('ExampleObject') and $object->can('foo');
Run Code Online (Sandbox Code Playgroud)
我试图像这样将其翻译成Ruby:
raise ArgumentError, "incompatible object given: #{object.inspect}"
unless object.is_a?(ExampleObject) and object.respond_to?(:foo)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为Ruby解释unless为新语句的开始。据我了解,我可以在第一行的末尾加一个反斜杠,但这看起来很丑,而且感觉不对。我也可以使用常规unless condition raise error end结构,但是我更喜欢原始表单的样式。有没有一种很好的(惯用的)方式将其作为单个语句写在Ruby中?
我无法让标准库的encoding/json包用于解码JSON对象.这是一个最小的例子:
b := []byte(`{"groups":[{"name":"foo"},{"name":"bar"}]}`)
type Group struct{ name string }
var contents struct {
groups []Group
}
err := json.Unmarshal(b, &contents)
fmt.Printf("contents = %+v\nerr = %+v\n", contents, err)
Run Code Online (Sandbox Code Playgroud)
这打印:
contents = {groups:[]}
err = nil
Run Code Online (Sandbox Code Playgroud)
但我希望:
contents = {groups:[{name:foo} {name:bar}]}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
当我十多年前学习 CSS 时,使用“默认字体”(无论这意味着什么)的标准(也是唯一)方法是:
font-family: serif;
font-family: sans-serif;
Run Code Online (Sandbox Code Playgroud)
然后,去年,Apple为其新系统字体添加了自定义语法,如果我没记错的话,Blink 也做了类似的事情。
更了解 CSS 的人能否总结font-family一下当我只想要默认的 sans-serif 或 serif 字体时我的属性应该是什么样子?(我特别不想要 webfonts。)
我正在派生一个可以从C++库中获得的类,我的子类的构造函数只有在我调用基类构造函数之前执行某些代码时才能正常工作.(是的,我知道,糟糕的设计,但我不能影响我正在使用的图书馆的工作方式.)
如果基类构造函数接受参数,那么这样做实际上非常简单:
struct A {
A(bool a) { printf("A::A()\n"); }
};
bool inject(bool a) { printf("inject()\n"); return a; }
struct B : public A {
B(bool a) : A(inject(a)) { printf("B::B()\n"); }
};
Run Code Online (Sandbox Code Playgroud)
现在,当我构造一个B的实例时,inject()之前会被调用A::A().但是当基类ctor没有参数时,有没有办法做到这一点?
我的应用程序的数据库记录有十位数的ID,空值可以用""或表示"0000000000".目前,我使用以下习惯来检查有效ID:
my $is_valid = $id =~ m/[0-9]{10}/ && $id =~ /[1-9]/;
Run Code Online (Sandbox Code Playgroud)
第一个正则表达式检查整体格式,第二个正则表达式"0000000000"通过查找字符串中某处的非空数字来排除该 值.我很好奇我是否可以将这两个正则表达式合二为一.
那个正则表达式的效率可能会低一些,但正如我所说,我只是好奇它是否可行.