---
title: 'Solidity WTF 102 16 單元'
lang: zh-tw
---
Solidity WTF 102 16 單元
===
:::info
:date: 2024/10/01
:::
[TOC]
# 課程學習
## 函數重載
假設有兩個函數名稱相同,但帶入的參數不同,則會視為不同的函數。
```xml=
function saySomething() public pure returns(string memory){
return("Nothing");
}
function saySomething(string memory something) public pure returns(string memory){
return(something);
}
```
這樣如果要處理相同商業邏輯,但會因不同帶入的參數做出相對應的處理方式,可以使用此方法。
## 參數匹配
使用上述方法,可以避免在多寫入一個判斷式,可以解省一些問題時間,但如果遇到下列程式。
```xml=
function f(uint8 _in) public pure returns (uint8 out) {
out = _in;
}
function f(uint256 _in) public pure returns (uint256 out) {
out = _in;
}
```
會因為輸入的參數既可以是`uint8`,也可以是`uint256`,`Solidity`無法辨別,故會報錯。
:::success
可以加入任意參數解決此問題。
:::
## 函數分辨方法
他會進行`keccak256`加密方式,把`function`名稱與帶入參數進行加密,以進行分辨。
```xml=
<!-- 會用這種方是去看函數的哈希值,並進行分辨 -->
keccak256(saySomething(string memory something))
```

```xml=
<!-- 這是另一種相同名稱函數 -->
keccak256(saySomething())
```

會是截然不同的哈希值。
## 為何uint無法分辨
儘管`uint8`和`uint256`在`keccak256`加密會是不同哈希值,但是`EVM`會在處理`ABI`編碼時,自動將`uint8`轉變成`uint256`,這是因為`EVM`在執行時會將所有整數類型擴展成`32`字節(`byte`)的表示形式(即`uint256`)。
## 本章重點
:::warning
本章重點我認為在參數匹配問題。
:::