09.方法和函数
<h1>09.方法和函数</h1>
<h2>1、方法定义</h2>
<pre><code>#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&amp;self) -&gt; u32 {
self.width * self.height
}
}
fn main() {
let rect1 = Rectangle { width: 30, height: 50 };
println!(
&quot;The area of the rectangle is {} square pixels.&quot;,
rect1.area()
);
}
self、&amp;self 和 &amp;mut self
------------------------
需要注意的是,self 依然有所有权的概念:
self 表示 Rectangle 的所有权转移到该方法中,这种形式用的较少
&amp;self 表示该方法对 Rectangle 的不可变借用
&amp;mut self 表示可变借用</code></pre>
<h2>2、多个参数</h2>
<pre><code>struct Rectangle {
width: u32,
pub height: u32,
}
impl Rectangle {
fn area(&amp;self) -&gt; u32 {
self.width * self.height
}
fn can_hold(&amp;self, other: &amp;Rectangle) -&gt; bool {
self.width &gt; other.width &amp;&amp; self.height &gt; other.height
}
}
fn main() {
let rect1 = Rectangle { width: 30, height: 50 };
let rect2 = Rectangle { width: 10, height: 40 };
println!(&quot;Can rect1 hold rect2? {}&quot;, rect1.can_hold(&amp;rect2));
}</code></pre>
<h2>3、函数和方法</h2>
<p>函数:类方法:不带self参数
方法:对象方法:带self参数</p>
<pre><code>impl Rectangle {
// 函数:类方法:不带self参数
fn new(w: u32, h: u32) -&gt; Rectangle {
Rectangle { width: w, height: h }
}
// 方法:对象方法:带self参数
fn area(&amp;self) -&gt; u32 {
self.width * self.height
}
fn can_hold(&amp;self, other: &amp;Rectangle) -&gt; bool {
self.width &gt; other.width &amp;&amp; self.height &gt; other.height
}
}</code></pre>
<h2>4、常量函数const fn</h2>
<p>在编译时提前计算</p>
<pre><code>const fn add(a: usize, b: usize) -&gt; usize {
a + b
}
const RESULT: usize = add(5, 10);
fn main() {
println!(&quot;The result is: {}&quot;, RESULT);
}</code></pre>