-2

我正在尝试调整 Ruby/Rails 函数中的变量。许多其他语言的标准内容。

在 c 中:

void change(int *io){
  *io = 1;
}

现在我们都知道 Ruby 是通过引用传递的(笑脸)。这段代码完美运行:

def tester()
  value = 'dave'
  test_replace(value)
  p value.to_s;
end

def test_replace(ioValue)
  ioValue.replace 'test'  
end

输出是“测试”。

所以问题是:固定数字没有替换方法。它们的传递方式与其他值不同。

所以我的问题是:我如何在 Ruby 中“io”一个“int”?

def tester()
  value = 10
  test_replace(value)
  p value.to_s;
end

def test_replace(ioValue)
  ioValue.replace 15  
end

这引起了

10:Fixnum 的未定义方法“替换”

4

3 回答 3

5

@Linuxios 在他关于按值传递的解释中是正确的,但他的解决方法非常尴尬。使用支持替换的SimpleDelegator将 fixnum 装箱非常容易:

class NumberBox < SimpleDelegator
  alias_method :replace, :__setobj__
  class <<self; alias_method :[], :new; end
end

def tester()
  value = NumberBox[10]
  test_replace(value)
  p value.to_s;
end

def test_replace(ioValue)
  ioValue.replace 15  
end

上面的value行为与它委托给的对象完全一样,在初始化时建立(with::new或 the NumberBox::[]),除了它还支持将新对象绑定为受委托者的__setobj__方法及其别名。replace

于 2013-03-12T00:54:01.367 回答
2

实际上有两种方法可以做到这一点:

  1. 包裹在一个对象中
  2. 包裹在一个数组中
  3. 创建一个可变整数代理对象

选项二很简单,我不会举例。选项 1 如下所示:

class IntRef < BasicObject
  def initialize(i)
    @int = i
  end
  def replace(v)
    @int = v
  end
  def method_missing(name, *args, &block)
    @int.send(name, *args, &block)
  end
end

或选项三:代理对象!

class MutableInt < BasicObject
  def initialize(i)
    @int = i
  end
  def method_missing(name, *args, &block)
    v = @int.send(name, *args, &block)
    if(v.is_a?(::Fixnum))
      @int = v
      return self
    end
    v
  end
end

警告:任何事情,对这个代理所做的任何事情都会粘住并改变对象。谨防。

于 2013-03-12T00:03:16.187 回答
0

现在我们都知道 Ruby 是通过引用传递的

相反,Ruby 只是按值传递。没有通过引用。与 Java、Python 等相同。

于 2013-03-12T07:16:26.920 回答