我是来自C的Ruby和Rails的新手。 我想知道如何更新方法中的值,比如当我将地址作为参数发送给C时的指针。
def upd_value(str)
str = "salut"
end
str = "bonjour"
upd_value(str)
puts str
我可以使用replace
来更改它,这有效。
这是一个错误,因为我使用了一个字符串作为示例,我想更新一个数组。有什么想法吗?
答案 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
],因为a
和b
指向同一个对象。
事实上,你一直在使用指针。
如果你想像在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
所有这些修改都将保留,因为外部作用域保存了对您在该方法中操作的同一个数组实例的引用。