我想知道在调用方法时是否有一种简单的方法来传递所有局部变量,而不是逐个传递它们作为参数。我想要以下内容:
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
显示HELLO THERE!
。但它返回错误:NameError: undefined local variable or method 'message'
。
我尝试local_variables
将所有局部变量作为符号数组。但我似乎无法访问实际变量,因为似乎没有像local_variable_get
这样的Ruby方法。
问题的背景
在我的Rails应用程序中,我有一个控制器,它有三种不同视图文件的更新方法。所有这些行为完全相同(它们都会更新资源,显示错误,如果有的话等)。他们唯一的主要区别是
我只有三个变量,所以将它们作为参数传递确实很容易,但我只是想知道是否有一个优雅的解决方案。
答案 0 :(得分: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
你不能在没有传递任何参数的情况下完成它,但你可以只传递一个绑定参数,并从那里引用所有局部变量。
答案 1 :(得分:1)
将消息和语言作为实例变量。 然后你可以在私有方法中访问它们。
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
puts Greeting.new.hello
答案 2 :(得分:1)
使用实例变量。在您的方法say_greeting
中,请务必先调用方法hello
,否则@message
的值将为nil
。
def hello
@message = "Hello there"
end
def say_greeting
hello #method call
puts message
end