cで値スワップ関数を書きたいという課題があり、Rubyでそれを行う方法もわかりません
Rubyでのようなもの
a = 1
b = 2
value_swap!(a,b)
puts a #=> 2
puts b #=> 1
ここで難しいのは、関数を使用してメイン スコープの値を変更する方法です。
これは大きなハックですが、次のようなことを試すことができます。
def value_swap(a,b,parent_binding)
parent_binding.eval("#{a},#{b}=#{b},#{a}")
end
a=1
b=2
value_swap :a,:b,binding
puts a
puts b
Ruby文字列は変更可能であるため、次のことができます。
a= "43"
b= "42"
def wtf!(a, b)
t= a.clone
a.gsub!(a, b)
b.gsub!(b, t)
end
wtf!(a, b)
puts a, b
残念ながら、Fixnumは変更できないため、self=nは機能しません。
編集:可変データ構造の別の例
もう1つの可変データ構造である配列があります。これは私の答えを明確にするかもしれません。
a= [43]
b= [42]
def omg!(a, b)
b[0], a[0]= a[0], b[0]
end
omg!(a, b)
p a, b
Rubyは、変数の並列割り当てをサポートしています。これは、次のように変数の値を交換する場合に便利です。
irb(main):001:0> a = 1
=> 1
irb(main):002:0> b = 2
=> 2
irb(main):003:0> a,b = b,a
=> [1, 2]
irb(main):004:0> a
=> 2
irb(main):005:0> b
=> 1
irb(main):006:0>
しかし、それは実際には割り当てに役立たないと思います。Cでは、参照を操作します。たとえば、これらの変数のポインターを関数に渡してから操作します。
あなたが解決策を思い付くことができないならば、ここに試みがあります(私のものではありません):
void swap(int *i, int *j) {
int t = *i;
*i = *j;
*j = t;
}
void main() {
int a = 23, b = 47;
printf("Before. a: %d, b: %d\n", a, b);
swap(&a, &b);
printf("After . a: %d, b: %d\n", a, b);
}
Ruby のセマンティクスは、策略を用いない限り、あなたがしようとしていることを許可しません。
あなたが示した例では、並列代入を使用します。これはトリックを使用せず、コードの読者にはすぐにわかります。
a, b = b, a