$var++;
означает
$var = $var + 1;
, но это на самом деле ближе к
$var = defined($var) ? $var+1 : 1;
поскольку LHS трактуется как ноль (без предупреждения), если это не определено. Точно так же,
$my_hash{key}++;
эквивалентно
$my_hash{key} = defined($my_hash{key}) ? $my_hash{key}+1 : 1;
(Есть некоторые другие незначительные различия в редких случаях угловых, но ничего не волнует.)
Эквивалент Рубин
my_hash["key"] = my_hash["key"].to_i + 1;
или
# If my_hash["key"] is a number,
# Or if "my_hash" was created using "my_hash = Hash.new(0)".
my_hash["key"] += 1;
$ perl -E'
my %my_hash;
$my_hash{key}++; say $my_hash{key};
$my_hash{key}++; say $my_hash{key};
'
1
2
$ ruby -e'
my_hash = {};
my_hash["key"] = my_hash["key"].to_i + 1; p my_hash["key"];
my_hash["key"] = my_hash["key"].to_i + 1; p my_hash["key"];
'
1
2
$ ruby -e'
my_hash = {};
my_hash["key"] = 0;
my_hash["key"] += 1; p my_hash["key"];
my_hash["key"] += 1; p my_hash["key"];
'
1
2
$ ruby -e'
my_hash = Hash.new(0);
my_hash["key"] += 1; p my_hash["key"];
my_hash["key"] += 1; p my_hash["key"];
'
1
2
'string ++' будет пытаться увеличивать строку, например. как вы думаете, стоит ли «яблоко ++»? 'Orange'? 'Applf'? –
@MarcB Это будет 'applf' в Perl (при условии, что операция выполняется на скаляре). Я считаю, что «яблоко» + = 1' не определено в Ruby, но «apple» .succ' также должно производить 'applf' –
@ThisSuitIsBlackNot true, я отредактировал свой комментарий, чтобы указать, что он должен выполняться на скаляре. –