1

cで値スワップ関数を書きたいという課題があり、Rubyでそれを行う方法もわかりません

Rubyでのようなもの

a = 1

b = 2

value_swap!(a,b)

puts a #=> 2

puts b #=> 1

ここで難しいのは、関数を使用してメイン スコープの値を変更する方法です。

4

4 に答える 4

2

これは大きなハックですが、次のようなことを試すことができます。

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 
于 2012-07-16T07:41:15.107 に答える
1

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
于 2012-07-16T08:05:17.653 に答える
0

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);
}
于 2012-07-16T07:22:04.410 に答える
0

Ruby のセマンティクスは、策略を用いない限り、あなたがしようとしていることを許可しません。

あなたが示した例では、並列代入を使用します。これはトリックを使用せず、コードの読者にはすぐにわかります。

a, b = b, a
于 2012-07-16T15:15:35.680 に答える