更新方法内的值

时间:2015-06-15 17:16:03

标签: ruby

我是来自C的Ruby和Rails的新手。 我想知道如何更新方法中的值,比如当我将地址作为参数发送给C时的指针。

def upd_value(str)
    str = "salut"
end

str = "bonjour"
upd_value(str)
puts str

我可以使用replace来更改它,这有效。 这是一个错误,因为我使用了一个字符串作为示例,我想更新一个数组。有什么想法吗?

5 个答案:

答案 0 :(得分:1)

您可以使用String#replace

if (x - 45) < xs < (x + 45) and (y - 45) < ys < (x + 45)

答案 1 :(得分:1)

在Ruby中,(几乎)每个变量实际上都是一个对象的引用/指针,例如

a = [0, 1, 23]
b = a
a << 42
p b

将提供[0, 1, 23, 42],因为ab指向同一个对象。

事实上,你一直在使用指针。

如果你想像在C中那样进行指针运算,那么Ruby就无法做到这一点。

答案 2 :(得分:0)

str中的upd_value属于自己的范围,不会影响其外部的str = upd_value(str)。您需要明确重新分配它:

list.ForEach(tag => tag = foo(tag))

答案 3 :(得分:0)

这应该有效

def upd_value(str = nil)
    str = str || "test"
end

str = "bonjour"
puts upd_value(str)

答案 4 :(得分:0)

关于Ruby如何处理参数,请参阅“Is Ruby pass by reference or by value?”。

一般来说,您可以将对象传递给方法,修改该方法中的对象属性,并在方法返回后仍然存在修改。

您的示例中会发生的情况是局部变量str对参数str进行阴影处理。由于您对局部变量而不是传递的参数进行了赋值,因此只要方法返回并且其局部范围被销毁,修改就会丢失。

您的选项要么从方法中返回一个值,要么在外面使用它,如下所示:

def my_method(str)
  str + 'salut' # a new instance of string is created and returned
end

str = 'hey, '
str = my_method(str)

puts str # outputs 'hey, salut'

或使用mutator方法,例如#replace

def my_method(str)
  str.replace('salut') # same string instance is reused
end

str = 'whatever'
my_method(str)

puts str # outputs 'salut'

您可以通过使用索引更改值来轻松处理方法中传递的数组:

def my_method(array)
  array[15] = 10
end

或通过<<添加项目:

def my_method(array)
  array << 10
end

或者像这样调用它的方法:

def my_method(array)
  array.delete(0)
end

所有这些修改都将保留,因为外部作用域保存了对您在该方法中操作的同一个数组实例的引用。