如何从Ruby函数返回值供程序的其余部分使用
我已经编写了一个小的ruby函数,它根据字符串变量的长度来改变它。打印输出显示,在函数中,变量被更改了——但是,当在程序中稍后调用它时,它总是重置为默认值如何从Ruby函数返回值供程序的其余部分使用,ruby,Ruby,我已经编写了一个小的ruby函数,它根据字符串变量的长度来改变它。打印输出显示,在函数中,变量被更改了——但是,当在程序中稍后调用它时,它总是重置为默认值 #ruby variable test def mrn_value(mrn_length, mrn) if mrn_length < 7 case mrn_length when 6 mrn = '0' << mrn return mrn when 5 mrn
#ruby variable test
def mrn_value(mrn_length, mrn)
if mrn_length < 7
case mrn_length
when 6
mrn = '0' << mrn
return mrn
when 5
mrn = '00' + mrn
return mrn
when 4
mrn = '000' + mrn
return mrn
when 3
puts mrn
mrn = '0000' + mrn
puts mrn
return mrn
when 2
mrn = mrn.to_s
puts 'mrn of 2 length' #prints 'mrn of 2 length'
mrn = '00000' + mrn
puts 'mrn altered in case statement: ' + mrn #prints 'mrn altered in case statement 0000012'
when 1
mrn = '000000' + mrn
return mrn
end
end
end
mrn = 12
mrn = mrn.to_s
mrn_length = mrn.length
mrn_value(mrn_length, mrn)
puts 'Returned MRN: ' + mrn #prints '12'
#ruby变量测试
def mrn_值(mrn_长度,mrn)
如果mrn_长度<7
病例mrn_长度
当6
mrn='0'重新指定值有什么问题
mrn=mrn\u值(mrn\u长度,mrn)
重新分配值有什么问题
mrn=mrn\u值(mrn\u长度,mrn)
在所有行中,如:
mrn = '0' << mrn
或
注意,这只可能是因为字符串是可变的,这不适用于fixmum或符号
现在,在解释这一点时,为什么不简单地使用现有的字符串方法,例如rjust
mrn = '12'
mrn = mrn.rjust(7, '0')
在所有行中,例如:
mrn = '0' << mrn
或
注意,这只可能是因为字符串是可变的,这不适用于fixmum或符号
现在,在解释这一点时,为什么不简单地使用现有的字符串方法,例如rjust
mrn = '12'
mrn = mrn.rjust(7, '0')
如果我正确理解您的要求,您可以这样做:
#ruby variable test
def mrn_value(mrn_length, mrn)
value = ""
if mrn_length < 7
case mrn_length
when 6
value = '0' << mrn
when 5
value = '00' + mrn
when 4
value = '000' + mrn
when 3
puts mrn
value = '0000' + mrn
puts mrn
when 2
value = mrn.to_s
puts 'mrn of 2 length' #prints 'mrn of 2 length'
value = '00000' + mrn
puts 'mrn altered in case statement: ' + mrn #prints 'mrn altered in case statement 0000012'
when 1
value = '000000' + mrn
end
end
value
end
mrn = 12
mrn = mrn.to_s
mrn_length = mrn.length
mrn = mrn_value(mrn_length, mrn)
puts 'Returned MRN: ' + mrn
#ruby变量测试
def mrn_值(mrn_长度,mrn)
value=“”
如果mrn_长度<7
病例mrn_长度
当6
value='0'如果我正确理解您的需求,您可以这样做:
#ruby variable test
def mrn_value(mrn_length, mrn)
value = ""
if mrn_length < 7
case mrn_length
when 6
value = '0' << mrn
when 5
value = '00' + mrn
when 4
value = '000' + mrn
when 3
puts mrn
value = '0000' + mrn
puts mrn
when 2
value = mrn.to_s
puts 'mrn of 2 length' #prints 'mrn of 2 length'
value = '00000' + mrn
puts 'mrn altered in case statement: ' + mrn #prints 'mrn altered in case statement 0000012'
when 1
value = '000000' + mrn
end
end
value
end
mrn = 12
mrn = mrn.to_s
mrn_length = mrn.length
mrn = mrn_value(mrn_length, mrn)
puts 'Returned MRN: ' + mrn
#ruby变量测试
def mrn_值(mrn_长度,mrn)
value=“”
如果mrn_长度<7
病例mrn_长度
当6
value='0'问题是由ruby按值而不是按引用()传递方法参数引起的
如果您将mrn
更改为@mrn
,它将正常工作。@使它成为一个实例变量,我猜在本例中,它使它在整个模块中都可用 问题是由ruby通过值而不是引用()传递方法参数引起的
如果您将mrn
更改为@mrn
,它将正常工作。@使它成为一个实例变量,我猜在本例中,它使它在整个模块中都可用 我建议您阅读更多关于Ruby为什么是“按值传递”的内容。在mrn=12
中,mrn
是一个变量,在本例中是指向12的对象的指针
当您将mrn
传递到mrn\u值
时,您传递的是该指针的副本。现在有两个指针指向同一个对象。当您执行mrn='00000'+mrn
时,您告诉第二个指针不再指向2,而是指向右侧的任何其他指针。您可以看到,在mrn\u值
方法之外的原始mrn
指针仍然指向2
你可以阅读更多关于。为您提供一个简化版本,以演示:
a = 1
def will_a_be_changed(a)
a = 2
puts a #=> 2
end
will_a_be_changed(a)
puts a #=> 1
我建议您阅读更多关于Ruby为什么是“按值传递”的内容。在mrn=12
中,mrn
是一个变量,在本例中是指向12的对象的指针
当您将mrn
传递到mrn\u值
时,您传递的是该指针的副本。现在有两个指针指向同一个对象。当您执行mrn='00000'+mrn
时,您告诉第二个指针不再指向2,而是指向右侧的任何其他指针。您可以看到,在mrn\u值
方法之外的原始mrn
指针仍然指向2
你可以阅读更多关于。为您提供一个简化版本,以演示:
a = 1
def will_a_be_changed(a)
a = 2
puts a #=> 2
end
will_a_be_changed(a)
puts a #=> 1
谢谢你的解释和例子。我以为“return”命令会导致修改后的变量在函数外部可用,是我弄错了吗?Ruby是按值传递的,而不是按引用传递的。不能传递变量,变量不是对象。您只能传递对象。@Elisa-如果您遵循下面的rohit89示例,这将起作用。你得把它重新分配给mrn。@Phil哦,我明白了。我习惯在PHP中这样做,在PHP中我会“返回”一个值以供使用,并已将其赋值。感谢您的解释和示例。我以为“return”命令会导致修改后的变量在函数外部可用,是我弄错了吗?Ruby是按值传递的,而不是按引用传递的。不能传递变量,变量不是对象。您只能传递对象。@Elisa-如果您遵循下面的rohit89示例,这将起作用。你得把它重新分配给mrn。@Phil哦,我明白了。我习惯在PHP中这样做,在PHP中我会“返回”一个值以供使用,并已将其赋值。感谢您的建议--我尝试使用mrn.rjust,但出于某种原因,在该格式中,它不会将存储结果写入.csv。它确实以另一种格式保存它们。Shrugs谢谢你的建议--我尝试过使用mrn.rjust,但由于某种原因,在该格式中,它不会写入.csv,表明我有存储结果。它确实以另一种格式保存它们。耸耸肩