【问题标题】:Return nested struct inside struct in Solidity在 Solidity 结构中返回嵌套结构
【发布时间】:2021-11-17 21:29:42
【问题描述】:

似乎是一个相对简单的问题,但我无法在文档或网上找到直接答案。

如果在 Solidity 中我请有一个带有结构映射的结构我试图在一个函数中返回它我到达了死胡同,如果我将它设置为“内存”的返回类型我收到一个错误,因为它是嵌套的,它必须声明为 'storage' 类型,但 'storage' 类型不能用于从函数返回数据:

pragma solidity ^0.8.0;

contract Nested {

    struct Parent {
        string parentPropertyA;
        mapping(uint=>Child) childProperty;
    }

    struct Child {
       string childPropertyA;
    }

    mapping(uint=>Parent) parents;

    function getParent(uint parentId) public view returns (Parent memory) {
        Parent memory parent = parents[parentId];
        return parent;
    }
}   

TypeError: Types containing (nested) mappings can only be parameters or return variables of internal or library functions.

是否不支持嵌套结构映射返回,我必须将其展平才能返回?

我看到有关嵌套数组的问题,但想验证和验证!

【问题讨论】:

  • 请编辑您的问题并分享导致此错误的代码。
  • @James Roeiter - 嘿,伙计,如果您发现我的解决方案有用,如果您能投票,那就太棒了。如果您需要任何进一步的说明,请告诉我。
  • @Issei - 我做了一些澄清并添加了一个代码示例。请问您知道如何解决吗?

标签: blockchain ethereum solidity smartcontracts


【解决方案1】:

结构是一个对象。要将其作为值返回,您必须将其展平。

如果有人有一个神奇的把戏,我很想知道。

【讨论】:

    【解决方案2】:

    如果不查看您的代码,很难理解您究竟需要什么,但我已尽力解决该问题。函数valueFromStruct 返回内部结构值。

    pragma solidity >= 0.7.0 < 0.9.0;
    
    contract test {
        
        struct Identity {
            uint age;
            string name;
        }
        
        struct NestedIdentity {
            Identity identity;
        }
        
        Identity identity = Identity(29, 'Issei Kumagai');
        
        NestedIdentity nested_identity = NestedIdentity(identity);
        
        function valueFromStruct() public view returns(uint age, string memory name) {
            return (nested_identity.identity.age, nested_identity.identity.name);
        }
    
    }
    

    您可以看到,当您调用下面的函数时,返回了identity 结构中的值。

    valueFromStruct 函数也可以这样写:

    function valueFromStruct() public view returns(Identity memory) {
        return nested_identity.identity;
    }
    

    如果您使用映射对象,则可以进一步增强这两种解决方案,以便您可以根据 uintaddress 查找嵌套结构 - 即,您可以将一组嵌套结构保存在一个哈希表中。

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2014-10-12
      相关资源
      最近更新 更多