著者について。 Federico Mena-Quinteroはメキシコのプログラマーであり、GNOMEプロジェクトの創設者の一人です 。
Librsvgは転換点に達しました。アクセサーを追加するよりも、CからRustにいくつかのコアパーツを移植する方が簡単であることが突然判明しました。 さらに、Rustではより多くの肉が記述されるようになりました。
今では2つの言語を頻繁に切り替える必要があり、Cは非常に原始的に見えます。
エレジーC
C 24 .
“The C Programming Language by K&R” . Turbo Pascal, , C .
K&R —
.
malloc()/free()
, . !
C. . , Unix 20 000 .
GIMP GTK+ . GNOME , . , 20 000 C .
.
.
C
POV-Ray .
GTK+ , .
SIOD, Guile — , Scheme C.
Eye of GNOME .
Evolution . Solaris Purify; Valgrind.
gnome-vfs.
Mesa.
Nautilus-share ,
free()
.
, .
, .
, - Rust, C.
, Rust,
« Rust ». Rust C++:
« » (RAII), , , .
- :
free()
. , , . , Drop, . , . - : ( , , ..) . : . .
// C , , , (
, )… , .
( )
Vec<T>
,
T
. .
,
T
.
C … .
() —
Rust — Java- - . , Java — :
Drawable
,
draw ()
.
.
() . ,
Iterator
:
pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
,
Iterator
-
Item
.
next()
,
Some(YourElementType)
. ,
None
.
.
, Rust
for
,
IntoIterator
:
pub trait IntoIterator {
/// The type of the elements being iterated over.
type Item;
/// Which kind of iterator are we turning this into?
type IntoIter: Iterator<Item=Self::Item>;
fn into_iter(self) -> Self::IntoIter;
}
Item
,
IntoIter
—
Iterator
, .
, . « foo bar, , ».
C , , .
:
pkg-config
Autotools.- include ...
- … .
- , .
Cargo.toml
, . c .
.
cargo build
.
- C :
- . , , .
#include
, #ifdef
. - Makefile, , , .
- . . .
Rust :
#[test]
fn test_that_foo_works() {
assert!(foo() == expected_result);
}
…
cargo test
, . . Makefile, , .
-.
Rust Markdown.
.
:
/// Multiples the specified number by two
///
/// ```
/// assert_eq!(multiply_by_two(5), 10);
/// ```
fn multiply_by_two(x: i32) -> i32 {
x * 2
}
, .
23.02.2018: QuietMisdreavus ,
rustdoc doctests . .
Rust , C. ,
max (5 + 3, 4)
.
C, -
int
short
,
char
- — Rust . .
.
, Rust
Rust , « Rust» ( ,
unsafe {}
) .
>>
— .
gcc
,
switch()
enum, ? .
Rust
.
match()
. , :
impl f64 {
pub fn sin_cos(self) -> (f64, f64);
}
let angle: f64 = 42.0;
let (sin_angle, cos_angle) = angle.sin_cos();
match()
. .
let color = "green";
match color {
"red" => println!("it's red"),
"green" => println!("it's green"),
_ => println!("it's something else"),
}
?
my_func(true, false, false)
, :
pub struct Fubarize(pub bool);
pub struct Frobnify(pub bool);
pub struct Bazificate(pub bool);
fn my_func(Fubarize(fub): Fubarize,
Frobnify(frob): Frobnify,
Bazificate(baz): Bazificate) {
if fub {
...;
}
if frob && baz {
...;
}
}
...
my_func(Fubarize(true), Frobnify(false), Bazificate(true));
,
. boolean , , .
#[derive(Debug)]
(, ),
#[derive(Debug)]
— Rust , . , gdb .
user_data
.
« », . , , .
C — . Unix, . .
Rust , . , , . , , .