< 返回版块

ckh0715 发表于 2021-07-18 09:41

请问像是在java中常用的getter/setter,在rust中对应的形式是怎么样的呢?能给出一些例子吗?刚刚接触rust没几天,因为涉及到一些所有权或者别的什么问题,不知道如何做才是最安全可靠的。

评论区

写评论
Yogaflre 2021-07-21 10:38

不需要把Java的getter/setter僵化的带入其他语言,你真的需要它吗?

luyikk 2021-07-19 01:16

你可以使用 https://crates.io/crates/getset

苦瓜小仔 2021-07-18 12:46

getter:

API Guidelines: getter 命名规范:https://zjp-cn.github.io/api-guidelines/naming.html#getter-%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83

setter:

  1. API Guidelines: 利用构造模式构造复杂的值:https://zjp-cn.github.io/api-guidelines/type-safety.html#%E5%88%A9%E7%94%A8%E6%9E%84%E9%80%A0%E6%A8%A1%E5%BC%8F%E6%9E%84%E9%80%A0%E5%A4%8D%E6%9D%82%E7%9A%84%E5%80%BC
  2. API Guidelines: 构造函数:https://zjp-cn.github.io/api-guidelines/predictability.html#%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E6%98%AF%E9%9D%99%E6%80%81%E7%9A%84%E5%9B%BA%E6%9C%89%E7%9A%84%E6%96%B9%E6%B3%95
Aya0wind 2021-07-18 11:36

一般是分场景,然后按名字区分。比如一个getter,其功能可能是获取可变引用,也可能是获取不可变引用,还可能是获取对象内部一个成员的所有权。
所以getter一般就是分三种写法,如果是第一个,一般叫get_xxx_mut,第二个就是get_xxx,第三个我个人喜欢命名为take_xxx,意为交出所有权,比如获取一个线程池里的线程对象,就可以叫take_one_thread。
当然命名不是死的,像vec的获取尾元素所有权就是pop而不是叫take_last,交出某个索引的元素的所有权叫remove。
rust里区分这几种情况主要是看函数的参数和返回值类型,名字只是辅助识别,重要的是类型,你的类型一定要符合要求,名字可以自己发挥,方便别人看懂意思就行,设计一个getter之前先看其属于上面这三种情况的哪一种。

Mike Tang 2021-07-18 10:01

有所有权相关问题。

比如,rust中的getter,一般可分成两种

.get_xxx()

.get_mut_xxx()

。这样把可改和不可改分开了。其实更不容易犯错。

另外,setter 的主对象一定是 &mut 或 owner。

Mike Tang 2021-07-18 10:00

也可以仿照写 getter/setter。

但是rust中并无强制这种pattern。

在快速开发时,可用模板生成器生成这些API。

1 共 6 条评论, 1 页