Solidity

作為其他合約中的介面與列舉進行互動

  • March 17, 2022

在其他契約中使用列舉作為介面的問題:將感謝您的幫助…

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.9;

interface interEnum {
   enum SIDE {
       buy,
       sell
   }
}

contract B is interEnum {

   function bEnum(SIDE side) external {
       // do something with here
   }
}

contract A {
   B b;
   enum NUM {
       buy,
       sell
   }
   function bEnum(NUM num) external {
       // i cant pass in an enum from here.
       // invalid explicit conversion from uint256 to Enum when i tried it this way
       // b.bEnum(uint256(num);

       // b
       // invalid explicit conversion from enum to enum....
       // b.bEnum(num);

   }
}

Solidity 不允許從A.NUMto隱式轉換interEnum.SIDE,也不允許像b.bEnum(SIDE(num)). 由於您b.bEnum()SIDE其作為參數,因此您應該interEnum.SIDE只傳遞類型的參數。

contract A is interEnum {
   B b;

   function bEnum(SIDE num) external {
      b.bEnum(num);
   }
}

我擺弄並清理了一下,所以 Type 只在一個地方聲明(DRY)。

您可以將列舉轉換為數字,但您必須通過中間轉換才能到達那裡。由於列舉中只有兩個成員,因此它適合 auint8以便可以進行轉換。您必須先去那裡才能轉換為uint256.

在大多數情況下,您幾乎不會在列舉和數字之間進行轉換。數字通常意味著某種梯度,而當您需要硬編碼的類別或狀態時,列舉使事情更具可讀性。

無論如何,這將按預期編譯和工作。

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.9;

library Types {

   enum Side {
       buy,
       sell
   }
}

contract B {

   event TookSide(string side);

   function bEnum(Types.Side side) external {
       // Do something with it here
       if(side == Types.Side.buy) emit TookSide("buy");
       if(side == Types.Side.sell) emit TookSide("sell");
   }
}

contract A {

   B b;

   constructor(address _b) {
       b = B(_b);
   }

   function takeSide(Types.Side side) external returns(uint thing) {
       b.bEnum(side);
       thing = uint256(uint8(side));
   }
}
[
   {
       "from": "0xd9145CCE52D386f254917e481eB44e9943F39138",
       "topic": "0x39053e506755f3eaf8479a64ca6444658a68a5886c5992c63649ab2d3cd476d8",
       "event": "TookSide",
       "args": {
           "0": "sell",
           "side": "sell"
       }
   }
]

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/114606