新しいものを表示

ある意味スタックっぽい挙動?><;

orange さんがブースト

let foo = 1;
let foo = "foo";
bar(foo);

というのは、実際には

{
let foo = 1;
{
let foo = "foo";
{
bar(foo);
}
}
}

のようなことをやっているわけで、 shadow された変数が消えるわけでもないし破棄されるわけでもないし上書きされるわけでもない、あくまで shadow されて「名前で」参照できなくなるだけ

スレッドを表示
orange さんがブースト

あと Rust の shadowing は redeclaration ではないと思います

orange さんがブースト
orange さんがブースト

monad の do 記法を以て再宣言可能とするのは大嘘では????

Pascalなんて途中で宣言がそもそもできない>< Pascalすばらしい><(そこはちょっとめんどくさいと思ってました><;)

同一スコープ内での同名変数の再宣言とシャドウイング|Rustでは再宣言が可能 qiita.com/aimof/items/01911a18

"別の言語ではどうなるか? その2:再宣言できる言語"

"Haskellでは、再宣言可能です。ちなみにHaskellの変数(と呼ぶのが適切かはわかりませんが)はimmutable(不変)です。"
めっちゃくちゃ変化してるじゃん?><;

右辺で型が自明じゃない記述にしか見えないし、そもそもシャドーイング?で何がうれしいのかさっぱりわからないかも・・・><

orange さんがブースト

ただ、この方式だと lifetime あたりの問題があって、たとえば

let name = read_line(); // 所有権ありの文字列
let name = name.trim(); // 旧 name の一部を borrow しているスライス

みたいなことができない (旧 name の生存期間が新 name の生存期間以上でなければならない) ので、万能ではない

スレッドを表示
orange さんがブースト

たとえば

let age = read_line();
let age = age.parse::<u32>().expect("Invalid age");

みたいにすれば、あるべき型の age にしかアクセスできなくなるので、 age_str と age_int が共存するよりも望ましいと考えることができる

スレッドを表示
orange さんがブースト

あと、シャドーイングをすると、たとえばこの例だと「2回目の束縛以降で、不正でありうる文字列型の URL データにアクセスできなくなる」という利点がある (URL でなく文字列として取り出したければ、明示的にそういう操作を行うべき)

スレッドを表示
orange さんがブースト

たとえば

let url = "example.com/"; // ここで文字列
let url = Url::parse(url).expect("Invalid URL"); // ここで Url 型

みたいなシャドーイングしたい場合があって、これもまあ賛否分かれるかもしれないけど、あくまで変数の意味を扱ってロジックを書きたいならこれもアリだと思いますね

オレンジのC# のコード、
double hoge = 1.0d;
みたいな、冗語法みたいな記述がわりとある・・・><;

例えば(架空の言語として)
//これは整数になります
let hoge = 1;
みたいな記述でも、なんか「・・・><;」ってなる><;(極端に言うとサフィックス必須とかにしてほしい><;)

orange さんがブースト

Rust は関数のパラメータと戻り値について型を指定しなければならない (変数や式では省略できる) ので、その辺り結構バランスが良いと思っている

スレッドを表示
orange さんがブースト

や、高階関数とか多用すると型変数ばかりになって大して嬉しくないようなことはあるんでしょうけどね

関数型言語の入門記事で型推論使いまくってるの読むたびに「(こんな文化圏の言語なら使いたくないかも・・・><)」って思ってめげてやめちゃう><(型記述原理主義者的発想)

そういえば、関数型言語文化圏の人々って「型を!」「型ありきの発想!!」って言うわりに、「自明なら書かなくてもいいよね」って型推論多用しまくる人が多い気がするのすごく謎かも><

orange さんがブースト

人間なんだから変数くらい型を付けようね (ハイ炎上)

orange さんがブースト
古いものを表示
:realtek:

思考の /dev/null