调用方法时如何传递所有局部变量

Jay*_*rio 3 ruby local-variables

我想知道在调用方法时是否有一种简单的方法来传递所有局部变量,而不是逐个传递它们作为参数.我想要以下内容:

class Greeting
  def hello
    message = 'HELLO THERE!'
    language = 'English'
    say_greeting
  end

  def konnichiwa
    message = 'KONNICHIWA!'
    language = 'Japanese'
    say_greeting
  end

  private def say_greeting
    puts message
  end
end

Greeting.new.hello
Run Code Online (Sandbox Code Playgroud)

显示HELLO THERE!.但它返回一个错误:NameError: undefined local variable or method 'message'.

我试图local_variables将所有局部变量作为符号数组.但我似乎无法访问实际变量,因为似乎没有类似的Ruby方法local_variable_get.

问题的背景

在我的Rails应用程序中,我有一个控制器,它有三种不同视图文件的更新方法.所有这些行为完全相同(它们都会更新资源,显示错误,如果有的话等).他们唯一的主要区别是

  1. 不成功时要呈现的模板
  2. 成功时重定向url
  3. 闪存成功消息

我只有三个变量,所以将它们作为参数传递确实很容易,但我只是想知道是否有一个优雅的解决方案.

saw*_*awa 5

正确的局部变量不是您要做的事情:在方法定义中封装引用.实例变量正是您要做的事情:在单个对象上的不同方法调用之间共享信息.您对局部变量的使用与此相反.

使用实例变量,而不是局部变量.

如果你坚持在方法之间引用局部变量,那么这是一种方法:

class Greeting
  def hello
    message = 'HELLO THERE!'
    language = 'English'
    say_greeting(binding)
  end

  def konnichiwa
    message = 'KONNICHIWA!'
    language = 'Japanese'
    say_greeting(binding)
  end

  private def say_greeting b
    puts b.local_variable_get(:message)
  end
end
Run Code Online (Sandbox Code Playgroud)

你不能在没有传递任何参数的情况下创建它,但是你可以只传递一个绑定参数,并从那里引用所有局部变量.