Сегодня чуть припозднился с постом. Иногда в репо встречаются какие-то обрывки из правил, и я трачу время, чтобы понять:
1) О чем вообще идет речь?
2) Откуда это он взял?
И вот сейчас пункт звучит:
17. Dont use this.f inside constructor
Кто это вообще использует? Я за все время ни разу не встречал в конструкторах this, а знаете почему?
Потому что его вообще нельзя использовать там!
Я к тому что, зачем писать пункт к себе в репо, который и так будет помечаться компилятором, как ошибка, и он не позволит вам собрать контракт...
Ну, в общем, рассказываю, что-о-чем тут.
Он читал официальные доки Solidity и встретил комментарий к коду:
State variables are accessed via their name and not via e.g. `this.owner`. Functions can be accessed directly or through `this.f`, but the latter provides an external view to the function. Especially in the constructor, you should not access functions externally, because the function does not exist yet.
Немного запутано написано, но я понял, что this, в этом случае, как бы выполняет вызов в функцию из вне создаваемого контракта, и так как последняя еще не существует, он выдает об этом ошибку.
При этом, если использовать туже функцию, но без this, то все работает нормально. Например:
contract TestThis {
uint256 private num;
// не работает
constructor() {
num = this.increment();
}
function increment() internal view returns(uint256){
return num + 5;
}
}
contract TestThis {
uint256 private num;
// работает
constructor() {
num = increment();
}
function increment() internal view returns(uint256){
return num + 5;
}
}В общем, не особо понял зачем этот пункт, раз все равно нельзя так сделать, но раз есть в списке, то разбираем и его.
Ну, и еще один пункт напоследок:
18. Internal is the default visibility level for state variables.
Тут все просто, у каждого типа данных в Solidity есть некое значение по-умолчанию. У uint - это 0, у bool - false и т.д.
И у каждой переменной состояния есть область видимости: public, external, internal и private. Если мы не указываем нужную нам область, то по умолчанию устанавливается internal, что запрещает обращаться к ней из других внешних контрактов.
#constructor #visibility