Rust vs Go:常用语法对比(二)(2)

简介: Rust vs Go:常用语法对比(二)(2)

31. Recursive factorial (simple)

Create recursive function f which returns the factorial of non-negative integer i, calculated from f(i-1)

创建递归函数f,该函数返回从f(i-1)计算的非负整数I的阶乘

func f(i int) int {
  if i == 0 {
    return 1
  }
  return i * f(i-1)
}
package main
import (
  "fmt"
)
func f(i int) int {
  if i == 0 {
    return 1
  }
  return i * f(i-1)
}
func main() {
  for i := 0; i <= 10; i++ {
    fmt.Printf("f(%d) = %d\n", i, f(i))
  }
}

输出

f(0) = 1
f(1) = 1
f(2) = 2
f(3) = 6
f(4) = 24
f(5) = 120
f(6) = 720
f(7) = 5040
f(8) = 40320
f(9) = 362880
f(10) = 3628800
fn f(n: u32) -> u32 {
    if n < 2 {
        1
    } else {
        n * f(n - 1)
    }
}
fn main() {
    println!("{}", f(4 as u32));
}

输出

24

or

fn factorial(num: u64) -> u64 {
    match num {
        0 | 1=> 1,
        _ => factorial(num - 1) * num,
    }
}
fn main (){
    println!("{}", factorial(0));
    println!("{}", factorial(1));
    println!("{}", factorial(2));
    println!("{}", factorial(3));
    println!("{}", factorial(4));
    println!("{}", factorial(5));
}

输出

1
1
2
6
24
120

32. Integer exponentiation by squaring

Create function exp which calculates (fast) the value x power n. x and n are non-negative integers.

创建函数exp,计算(快速)x次方n的值。 x和n是非负整数。

package main
import "fmt"
func exp(x, n int) int {
  switch {
  case n == 0:
    return 1
  case n == 1:
    return x
  case n%2 == 0:
    return exp(x*x, n/2)
  default:
    return x * exp(x*x, (n-1)/2)
  }
}
func main() {
  fmt.Println(exp(3, 5))
}

输出

fn exp(x: u64, n: u64) -> u64 {
    match n {
        0 => 1,
        1 => x,
        i if i % 2 == 0 => exp(x * x, n / 2),
        _ => x * exp(x * x, (n - 1) / 2),
    }
}
fn main() {
    let x = 16;
    let n = 4;
    println!("{}", exp(x, n));
}

输出

65536


33. Atomically read and update variable

Assign variable x the new value f(x), making sure that no other thread may modify x between the read and the write.

为变量x分配新值f(x),确保在读和写之间没有其他线程可以修改x。


package main
import (
  "fmt"
  "sync"
)
func main() {
  var lock sync.RWMutex
  x := 3
  lock.Lock()
  x = f(x)
  lock.Unlock()
  fmt.Println(x)
}
func f(i int) int {
  return 2 * i
}
use std::sync::Mutex;
fn f(x: i32) -> i32 {
    x + 1
}
fn main() {
    let x = Mutex::new(0);
    let mut x = x.lock().unwrap();
    *x = f(*x);
    println!("{:?}", *x);
}

输出

1


34. Create a set of objects

Declare and initialize a set x containing objects of type T.

声明并初始化一个包含t类型对象的集合x。

x := make(map[T]bool)
package main
import "fmt"
type T string
func main() {
  // declare a Set (implemented as a map)
  x := make(map[T]bool)
  // add some elements
  x["A"] = true
  x["B"] = true
  x["B"] = true
  x["C"] = true
  x["D"] = true
  // remove an element
  delete(x, "C")
  for t, _ := range x {
    fmt.Printf("x contains element %v \n", t)
  }
}
x contains element D 
x contains element A 
x contains element B 

or

x := make(map[T]struct{})
package main
import "fmt"
type T string
func main() {
  // declare a Set (implemented as a map)
  x := make(map[T]struct{})
  // add some elements
  x["A"] = struct{}{}
  x["B"] = struct{}{}
  x["B"] = struct{}{}
  x["C"] = struct{}{}
  x["D"] = struct{}{}
  // remove an element
  delete(x, "C")
  for t, _ := range x {
    fmt.Printf("x contains element %v \n", t)
  }
}
x contains element B 
x contains element D 
x contains element A 
use std::collections::HashSet;
fn main() {
    let mut m = HashSet::new();
    m.insert("a");
    m.insert("b");
    println!("{:?}", m);
}

输出

{"a", "b"}

35. First-class function : compose

Implement a function compose (A -> C) with parameters f (A -> B) and g (B -> C), which returns composition function g ∘ f

用参数f (A -> B)和g (B -> C)实现一个函数compose (A -> C),返回composition函数g ∘ f

package main
import "fmt"
import "strconv"
func compose(f func(A) B, g func(B) C) func(A) C {
  return func(x A) C {
    return g(f(x))
  }
}
func main() {
  squareFromStr := compose(str2int, square)
  fmt.Println(squareFromStr("12"))
}
type A string
type B int
type C int
func str2int(a A) B {
  b, _ := strconv.ParseInt(string(a), 10, 32)
  return B(b)
}
func square(b B) C {
  return C(b * b)
}
fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box<Fn(A) -> C + 'a>
  where F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C
{
  Box::new(move |x| g(f(x)))
}

or

fn compose<A, B, C>(f: impl Fn(A) -> B, g: impl Fn(B) -> C) -> impl Fn(A) -> C {
  move |x| g(f(x))
}
fn main() {
    let f = |x: u32| (x * 2) as i32;
    let g = |x: i32| (x + 1) as f32;
    let c = compose(f, g);
    println!("{}", c(2));
}

输出

5


36. First-class function : generic composition

Implement a function compose which returns composition function g ∘ f for any functions f and g having exactly 1 parameter.

实现一个函数组合,该函数组合为任何恰好有1个参数的函数f和g返回组合函数g ∘ f。

package main
import "fmt"
func composeIntFuncs(f func(int) int, g func(int) int) func(int) int {
  return func(x int) int {
    return g(f(x))
  }
}
func main() {
  double := func(x int) int {
    return 2 * x
  }
  addTwo := func(x int) int {
    return x + 2
  }
  h := composeIntFuncs(double, addTwo)
  for i := 0; i < 10; i++ {
    fmt.Println(i, h(i), addTwo(double(i)))
  }
}
0 2 2
1 4 4
2 6 6
3 8 8
4 10 10
5 12 12
6 14 14
7 16 16
8 18 18
9 20 20
fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box<Fn(A) -> C + 'a>
  where F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C
{
  Box::new(move |x| g(f(x)))
}

or

fn compose<A, B, C>(f: impl Fn(A) -> B, g: impl Fn(B) -> C) -> impl Fn(A) -> C {
  move |x| g(f(x))
}
fn main() {
    let f = |x: u32| (x * 2) as i32;
    let g = |x: i32| (x + 1) as f32;
    let c = compose(f, g);
    println!("{}", c(2));
}

输出

5


37. Currying

Transform a function that takes multiple arguments into a function for which some of the arguments are preset.

将一个接受多个参数的函数转换为一个预设了某些参数的函数。


package main
import (
  "fmt"
  "time"
)
type Company string
type Employee struct {
  FirstName string
  LastName  string
}
func (e *Employee) String() string {
  return "<" + e.FirstName + " " + e.LastName + ">"
}
type Payroll struct {
  Company   Company
  Boss      *Employee
  Employee  *Employee
  StartDate time.Time
  EndDate   time.Time
  Amount    int
}
// Creates a blank payroll for a specific employee with specific boss in specific company
type PayFactory func(Company, *Employee, *Employee) Payroll
// Creates a blank payroll for a specific employee
type CustomPayFactory func(*Employee) Payroll
func CurryPayFactory(pf PayFactory, company Company, boss *Employee) CustomPayFactory {
  return func(e *Employee) Payroll {
    return pf(company, boss, e)
  }
}
func NewPay(company Company, boss *Employee, employee *Employee) Payroll {
  return Payroll{
    Company:  company,
    Boss:     boss,
    Employee: employee,
  }
}
func main() {
  me := Employee{"Jack", "Power"}
  // I happen to be head of the HR department of Richissim Inc.
  var myLittlePayFactory CustomPayFactory = CurryPayFactory(NewPay, "Richissim", &me)
  fmt.Println(myLittlePayFactory(&Employee{"Jean", "Dupont"}))
  fmt.Println(myLittlePayFactory(&Employee{"Antoine", "Pol"}))
}
{Richissim <Jack Power> <Jean Dupont> 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0}
{Richissim <Jack Power> <Antoine Pol> 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0}
fn add(a: u32, b: u32) -> u32 {
    a + b
}
fn main() {
    let add5 = move |x| add(5, x);
    let y = add5(12);
    println!("{}", y);
}

输出

17


38. Extract a substring

Find substring t consisting in characters i (included) to j (excluded) of string s. Character indices start at 0 unless specified otherwise. Make sure that multibyte characters are properly handled.

查找由字符串s的字符I(包括)到j(不包括)组成的子字符串t。 除非另有说明,字符索引从0开始。 确保正确处理多字节字符。

package main
import "fmt"
func main() {
  s := "hello, utf-8 문자들"
  i, j := 7, 15
  t := string([]rune(s)[i:j])
  fmt.Println(t)
}
extern crate unicode_segmentation;
use unicode_segmentation::UnicodeSegmentation;
fn main() {
    let s = "Lorem Ipsüm Dolor";
    let (i, j) = (6, 11);
    let t = s.graphemes(true).skip(i).take(j - i).collect::<String>();
    println!("{}", t);
}

输出

Ipsüm

or

use substring::Substring;
let t = s.substring(i, j);

39. Check if string contains a word

Set boolean ok to true if string word is contained in string s as a substring, or to false otherwise.

如果字符串单词作为子字符串包含在字符串s中,则将布尔ok设置为true,否则设置为false。

package main
import (
  "fmt"
  "strings"
)
func main() {
  s := "Let's dance the macarena"
  word := "dance"
  ok := strings.Contains(s, word)
  fmt.Println(ok)
  word = "car"
  ok = strings.Contains(s, word)
  fmt.Println(ok)
  word = "duck"
  ok = strings.Contains(s, word)
  fmt.Println(ok)
}
true
true
false
fn main() {
    let s = "Let's dance the macarena";
    let word = "dance";
    let ok = s.contains(word);
    println!("{}", ok);
    let word = "car";
    let ok = s.contains(word);
    println!("{}", ok);
    let word = "duck";
    let ok = s.contains(word);
    println!("{}", ok);
}

输出

true
true
false
目录
相关文章
|
2月前
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
20 0
|
3月前
|
Java 编译器 Go
Go to Learn Go之基础语法
Go to Learn Go之基础语法
23 0
|
4月前
|
Rust 安全 编译器
30天拿下Rust之语法大全
Rust是一种系统级编程语言,以其独特的所有权系统和内存安全性受到开发者青睐。本文从基本数据类型入手,介绍了标量类型如整数、浮点数、布尔值及字符,复合类型如元组、数组和结构体等。此外,还探讨了变量与常量的声明与使用,条件判断与循环语句的语法,以及函数定义与调用的方法。文章通过示例代码展示了如何使用Rust编写简洁高效的程序,并简要介绍了注释与宏的概念,为读者快速掌握这门语言提供了实用指南。欲获取最新文章或交流技术问题,请关注微信公众号“希望睿智”。
58 1
|
3月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
6月前
|
存储 Java Go
|
5月前
|
Rust
Rust 中使用 :: 这种语法的几种情况
Rust 中使用 :: 这种语法的几种情况
|
6月前
|
Rust
Rust的if let语法:更简洁的模式匹配
Rust的if let语法:更简洁的模式匹配
|
6月前
|
编译器 Go 开发者
|
6月前
|
Go
go基础语法结束篇 ——函数与方法
go基础语法结束篇 ——函数与方法
|
6月前
|
编译器 Go 数据安全/隐私保护
go语言入门之路——基础语法
go语言入门之路——基础语法
下一篇
DataWorks