Ссылка на примитивную операторскую функцию - PullRequest
0 голосов
/ 24 января 2019

В Rust, есть ли способ обработать операторские функции, такие как add или sub?Мне нужно получить ссылку для этих функций, но я могу узнать только о чертах.Я оставлю здесь сравнительный анализ того, что мне нужно (например, методы-оболочки) в Python.

A = 1
B = 2
A.__add__(B)

#Or maybe do something more, like
C = int(1).__add__
C(2)

1 Ответ

0 голосов
/ 24 января 2019

Вы можете получить указатель функции на метод черты определенного типа через универсальный синтаксис вызова функции :

let fptr = <i32 as std::ops::Add>::add;    // type: `fn(i32, i32) -> i32`

fptr(1, 3);   // returns 4

Большой пример ( Детская площадка ):

use std::ops;

fn calc(a: i32, b: i32, op: fn(i32, i32) -> i32) -> i32 {
    op(a, b)
}

fn main() {
    println!("{}", calc(2, 5, <i32 as ops::Add>::add));  // prints 7
    println!("{}", calc(2, 5, <i32 as ops::Sub>::sub));  // prints -3
    println!("{}", calc(2, 5, <i32 as ops::Mul>::mul));  // prints 10
}

Ваш пример int(1).__add__ немного сложнее, потому что у нас есть частично примененная функция. В Rust это не встроено в язык, но вы можете легко использовать замыкания для достижения того же эффекта:

let op = |b| 1 + b;
op(4); // returns 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...