1

PHP では、以下の最初のコード スニペットに見られるように、変数の を別の変数&に割り当てるために使用できます。reference

より多くのコンテキストについては、PHPの「参照を返す」ドキュメントを参照してください... http://www.php.net/manual/en/language.references.return.php

PHP コード:

<?php
  $tree = array();
  $tree["branch"] = array();
  $tree["branch"]["leaf"] = "green";

  echo '$tree: ';
  var_dump($tree);

  $branch = &$tree["branch"];

  $branch = "total replacement!";

  echo '$tree: ';
  var_dump($tree);
?>

PHP の出力:

$tree: array(1) {
  ["branch"]=>
  array(1) {
    ["leaf"]=>
    string(5) "green"
  }
}
$tree: array(1) {
  ["branch"]=>
  &string(18) "total replacement!"
}

私がやったRubyでこれをやろうとしている:

tree = {}
tree["branch"] = {}
tree["branch"]["leaf"] = "green"

puts "tree: #{tree.inspect}"

branch = tree["branch"]

branch = "total replacement!"

puts "tree: #{tree.inspect}"

どの出力:

tree: {"branch"=>{"leaf"=>"green"}}
tree: {"branch"=>{"leaf"=>"green"}}

さて、この単純な代入は Ruby では機能しませんが、オブジェクトの変更は機能します:

Ruby コード (続き):

branch["lead"] = "red"
puts "tree: #{tree.inspect}"

ルビーの出力:

tree: {"branch"=>{"leaf"=>"red"}}

だから、オブジェクトの「親」を見つけて、私が行ったように変更できるようにする方法があるかどうか疑問に思っていますbranch["leaf"]

著者の編集:

代入によって他の変数へのハッシュ参照を変更することはできませんが(例: x = y)、そのメソッドを使用して既存のオブジェクトを変更することはできます。このアプローチを使用すると、以下に示すように、変数に newを擬似的に割り当てることができます...hashbranch.replace()

割り当てではなく置換:

tree = {}
tree["branch"] = {}
tree["branch"]["leaf"] = "green"

puts "tree: #{tree.inspect}"

branch = tree["branch"]

branch.replace({"leaf" => "red", "twig" => "brown"})

puts "tree: #{tree.inspect}"

出力:

tree: {"branch"=>{"leaf"=>"green"}}
tree: {"branch"=>{"leaf"=>"red", "twig"=>"brown"}}
4

2 に答える 2

1

変数はキーを格納できます

間接参照やKernel#evalを使用しようとするのではなく、必要なキーを格納または定義するために変数または式を使用するのが Ruby のやり方です。これは PHP コードとまったく同じではありませんが、Ruby のネイティブ Hash メソッドを使用して、特定の値のキーを見つけることができます。

欲しい鍵を探す

オブジェクトの「親」を見つけて、branch ["leaf"] で行ったように変更できるようにする方法があるかどうか疑問に思っています。

ハッシュの性質を考慮してください。ハッシュ内の各キーは一意である必要がありますが、ネストされたハッシュのキーは、親または兄弟ハッシュのキーと同じにすることができます。例えば:

# Keys for nested hashes can be the same.
tree = {
  branch1: { leaf: 'green' },
  branch2: { leaf: 'red'   },
}
#=> {:branch1=>{:leaf=>"green"}, :branch2=>{:leaf=>"red"}}

# Duplicate keys; last one "wins."
tree = {
  branch: { leaf: 'green' },
  branch: { leaf: 'red'   },
}
#=> {:branch=>{:leaf=>"red"}

明るい面では、ハッシュの特定のレベルには、必要なものと一致するキーが1 つだけあることを意味します。それを見つける方法はいくらでもあります。一例として、Hash#rassocを使用して必要なキーを返します。

tree.rassoc( {leaf: 'red'} ).first
#=> :branch2

#select#each_pairなどの他のメソッドも、ニーズや表現しようとしている内容のセマンティクスによっては役立つ場合があります。

キー名の使用

キーを取得したら、そのキーを使用して、そのキーに関連付けられた値を変更できます。例えば:

tree = {
  branch1: { leaf: 'green' },
  branch2: { leaf: 'red'   },
}
key = tree.rassoc( {leaf: 'red'} ).first
tree[key] = { leaf: 'blue' }
tree
#=> {:branch1=>{:leaf=>"green"}, :branch2=>{:leaf=>"blue"}}
于 2013-05-23T04:19:51.063 に答える
0

まず、Ruby は参照渡しです。このように考えてください - この行:

branch = tree["branch"]

ここで作成した基になるハッシュへの 2 番目の参照を作成しています。

tree["branch"] = {}

それらの参照は次のとおりです。

  1. ローカルbranch変数。
  2. treekeyのハッシュのハッシュ値branch

ローカル変数に別の値を代入すると、branch1 つの参照が削除されます。たとえば、参照自体ではなく参照ホルダーが変更されます。Ruby では、まったく別の参照が変更されたときに、ハッシュ内の参照が変更されるとは思わないでしょう。

一部のオブジェクトは、たとえばハッシュなど、インプレースで更新できる操作をサポートしていますが、説明しているようなカスケード参照変更を実行する機能はありません(たとえば、オブジェクトへのすべての参照を他のオブジェクトに変更します) )。

于 2013-05-23T02:36:44.390 に答える