如何从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函数,它根据字符串变量的长度来改变它。打印输出显示,在函数中,变量被更改了——但是,当在程序中稍后调用它时,它总是重置为默认值

#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,表明我有存储结果。它确实以另一种格式保存它们。耸耸肩