2015-08-22 12 views
6

làm thế nào để tôi nối các chuỗi trong sự vững chắc?Nối chuỗi trong sự vững chắc?

var str = 'asdf' 
var b = str + 'sdf' 

dường như không làm việc ..

Tôi nhìn lên các tài liệu (https://github.com/ethereum/wiki/wiki/Solidity-Tutorial#elementary-types-value-types) và không có được nhiều đề cập về nối chuỗi. Nhưng nó được tuyên bố rằng nó hoạt động với dấu chấm ('.')?

"[...] a mapping key k is located at sha3(k . p) where . is concatenation." 

Đã không làm việc ra cho tôi quá ..:/

Trả lời

9

Bạn không thể nối chuỗi. Bạn cũng không thể kiểm tra bằng (str0 == str1). Loại chuỗi này vừa mới được thêm trở lại ngôn ngữ nên có thể sẽ mất một lúc cho đến khi tất cả các thao tác này hoạt động. Những gì bạn có thể làm (mà họ đã thêm gần đây) là sử dụng các chuỗi làm khóa cho ánh xạ.

Kết nối bạn trỏ đến là cách địa chỉ lưu trữ được tính toán dựa trên các loại trường và như vậy, nhưng được xử lý bởi trình biên dịch.

7

You have to do it manually for now

Tính bền chắc không cung cấp ghép nối chuỗi và chuỗi được tích hợp sẵn.
Tuy nhiên, bạn có thể tìm thấy thư viện và hợp đồng triển khai nối chuỗi và so sánh.

StringUtils.sol thư viện thực hiện so sánh chuỗi.
Oraclize contract srtConcat function thực hiện ghép nối chuỗi.

Nếu bạn cần ghép nối để nhận được băm của chuỗi kết quả, lưu ý rằng có các hàm băm tích hợp trong Solidity: sha256, ripemd160, sha3. Họ lấy một số lượng các đối số và thực hiện phép nối trước khi tính toán băm.

7

Một câu trả lời từ Ethereum Stack Exchange:

Một library thể được sử dụng, ví dụ:

import "github.com/Arachnid/solidity-stringutils/strings.sol"; 

contract C { 
    using strings for *; 
    string public s; 

    function foo(string s1, string s2) { 
    s = s1.toSlice().concat(s2.toSlice()); 
    } 
} 

Sử dụng trên cho một quick test mà bạn có thể sửa đổi cho các nhu cầu của bạn.


Kể từ concatenating strings needs to be done manually for now, và làm như vậy trong một hợp đồng có thể tiêu thụ khí không cần thiết (string mới phải được phân bổ và sau đó mỗi nhân vật bằng văn bản), nó là giá trị xem xét các trường hợp sử dụng mà cần nối chuỗi là gì?

Nếu DApp có thể được viết theo cách sao cho giao diện kết nối các chuỗi và sau đó chuyển nó vào hợp đồng để xử lý, đây có thể là thiết kế tốt hơn.

Hoặc, nếu hợp đồng muốn băm một chuỗi dài duy nhất, lưu ý rằng tất cả các built-in băm chức năng trong Vững Chãi (sha256, ripemd160, sha3) thực hiện một số biến của tham số và sẽ thực hiện nối trước khi tính toán các hash .

1

Dưới đây là một cách khác để chuỗi concat trong Solidity.Nó cũng được hiển thị trong số này tutorial:

pragma solidity ^0.4.19; 

library Strings { 

    function concat(string _base, string _value) internal returns (string) { 
     bytes memory _baseBytes = bytes(_base); 
     bytes memory _valueBytes = bytes(_value); 

     string memory _tmpValue = new string(_baseBytes.length + _valueBytes.length); 
     bytes memory _newValue = bytes(_tmpValue); 

     uint i; 
     uint j; 

     for(i=0; i<_baseBytes.length; i++) { 
      _newValue[j++] = _baseBytes[i]; 
     } 

     for(i=0; i<_valueBytes.length; i++) { 
      _newValue[j++] = _valueBytes[i++]; 
     } 

     return string(_newValue); 
    } 

} 

contract TestString { 

    using Strings for string; 

    function testConcat(string _base) returns (string) { 
     return _base.concat("_Peter"); 
    } 
} 
Các vấn đề liên quan