5

Ruby とこのサイトは初めてです。

次の 2 つの関数は異なります。1 つは関数の外部で変数を変更し、もう 1 つは変更しません。

def m1 (x)
  x << "4"
end

def m2 (x)
  x = x + "4"
end


str="123"

m2(str)   #str remains unchanged 123

m1(str)   #str is changed to 1234

これを正しく理解していることを確認したい -

m1 が呼び出されると、str への参照がコピーされ、それを x として認識する関数に渡されます。演算子 << は、元の str を参照する x を変更するため、この操作によって str が変更されます。

m2 が呼び出されると、str への参照がコピーされ、それを x として認識する関数に渡されます。演算子 + は新しい文字列を作成し、代入 x = x + "4" は x を新しい文字列にリダイレクトするだけで、元の str 変数は変更されません。

右?

ありがとう

メソッドの宣言と呼び出し

4

3 に答える 3

10

String#+:: Concatenation - に連結されstr + other_str → new_strた新しい文字列を返します。other_strstr

String#<<:: str << integer → str: Append - 指定されたオブジェクトを に連結しますstr

<<新しいオブジェクトを作成しません+

a = "str"
#=> "str"
a.object_id
#=> 14469636
b = a << "ing"
#=> "string"
a.object_id
#=> 14469636
b.object_id
#=> 14469636

a=  "str"
#=> "str"
b = a + "ing"
#=> "string"
a.object_id
#=> 16666584
b.object_id
#=> 17528916

編集

あなたのコメントから、あなたのポイントを得ました。下記参照:

def m1 (x)
 x << "4"
end
#=> nil
def m2 (x)
 x = x + "4"
end
#=> nil

str="123"
#=> "123"

m2(str)
#=> "1234"

str
#=> "123"

method 内で値を渡しても、ここでstrは変更されませんでしたm2()。すべての変更は、上記の呼び出しに従ってメソッドに対してローカルです。したがって、以下strはその変更を示していません。変更を確認するには、以下のように呼び出す必要があります。

str = m2(str)
#=> "1234"

str
#=> "1234"

また

以下のようにできます:-参照アドレスを渡しましstrたが、値は渡しませんでした。

str = "abc"
#=> "abc"
str.object_id
#=> 16250484
ObjectSpace._id2ref(16250484)
#=> "abc"
def m1 (x)
ObjectSpace._id2ref(x) << "4"
end
#=> nil
m1(16250484)
#=> "abc4"
str
#=> "abc4"

それが理にかなっていることを願っています:)

乾杯!

于 2013-03-17T14:41:46.953 に答える
1

次の 2 つの関数は異なります。1 つは関数の外部で変数を変更し、もう 1 つは変更しません。

これは間違っています。2 つのメソッドのどちらも変数を変更しません (これらはメソッドであり、関数ではありません。Ruby には関数がありません。根本的な違いがあります) str変数が指すm1オブジェクトを変更しますが、それは変数自体を変更することとはまったく異なります。

于 2013-03-18T10:58:09.790 に答える