我真的很新的Perl和閱讀一些代碼後,我偶然發現了這種說法:Perl和Ruby的語法散列
my_hash{string}++
其中my_hash
變量是一個Hash,字符串是任意字符串。
我的猜測是:
my_hash{string} = string++
和誰能這行代碼轉化爲Ruby的呢?
我真的很新的Perl和閱讀一些代碼後,我偶然發現了這種說法:Perl和Ruby的語法散列
my_hash{string}++
其中my_hash
變量是一個Hash,字符串是任意字符串。
我的猜測是:
my_hash{string} = string++
和誰能這行代碼轉化爲Ruby的呢?
$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
my_hash{string}++
被遞增存儲在哈希的整數,例如:
my %my_hash;
$my_hash{hi} = 0;
$my_hash{hi}++;
print "$_ $my_hash{$_}\n" for (keys %my_hash);
#> hi 1
紅寶石散列被與[]
訪問和Ruby不實現++
,所以您必須使用+= 1
。等價的Ruby代碼是:
my_hash = {}
my_hash['hi'] = 0
my_hash['hi'] += 1
puts my_hash
#> {"hi"=>1}
Perl和Ruby中的哈希值不一定是整數。 '++'和'+ = 1'也適用於浮點數。 – mob
'string ++'會嘗試增加字符串,例如:你認爲'apple ++'的價值是什麼? 'orange'? 'applf'? –
@MarcB這將是Perl中的'applf'(假設操作是在標量上執行的)。我相信''蘋果「+ = 1'沒有在Ruby中定義,但''蘋果」.succ'也應該產生'applf' –
@ThisSuitIsBlack不是真的,我編輯了我的評論,指出它必須在標量上執行。 –