【发布时间】:2011-09-12 10:49:09
【问题描述】:
我需要在一个方法中将一个值存储在一个变量中,然后我需要在另一个方法或闭包中使用该变量中的该值。我如何分享这个价值?
【问题讨论】:
标签: groovy
我需要在一个方法中将一个值存储在一个变量中,然后我需要在另一个方法或闭包中使用该变量中的该值。我如何分享这个价值?
【问题讨论】:
标签: groovy
在 Groovy 脚本中,作用域可能与预期不同。这是因为 Groovy 脚本本身就是一个类,它有一个运行代码的方法,但这一切都是在运行时完成的。我们可以通过省略类型定义或在 Groovy 1.8 中添加 @Field 注释来定义脚本范围内的变量。
import groovy.transform.Field
var1 = 'var1'
@Field String var2 = 'var2'
def var3 = 'var3'
void printVars() {
println var1
println var2
println var3 // This won't work, because not in script scope.
}
【讨论】:
class Globals 解决方案是一种解决方法。
var1 = 'var1' 方法,但没有成功。我不得不使用@Field var1 = 'var1'
class Globals {
static String ouch = "I'm global.."
}
println Globals.ouch
【讨论】:
def i_am_not_global = 100 // This will not be accessible inside the function
i_am_global = 200 // this is global and will be even available inside the
def func()
{
log.info "My value is 200. Here you see " + i_am_global
i_am_global = 400
//log.info "if you uncomment me you will get error. Since i_am_not_global cant be printed here " + i_am_not_global
}
def func2()
{
log.info "My value was changed inside func to 400 . Here it is = " + i_am_global
}
func()
func2()
这里i_am_global变量是func使用的全局变量,然后func2又可以使用
如果你用 def 声明变量,它将是本地的,如果你不使用 def 它是全局的
【讨论】:
与所有 OO 语言一样,Groovy 本身没有“全局”的概念(与 BASIC、Python 或 Perl 不同)。
如果您有多个方法需要共享同一个变量,请使用字段:
class Foo {
def a;
def foo() {
a = 1;
}
def bar() {
print a;
}
}
【讨论】:
只需在类或脚本范围内声明变量,然后从方法或闭包内部访问它。如果没有示例,很难更具体地解决您的特定问题。
但是,全局变量通常被认为是错误的形式。
为什么不从一个函数返回变量,然后将其传递给下一个函数?
【讨论】:
我认为您在谈论类级别的变量。 如上所述,使用全局变量/类级别变量不是一个好习惯。
如果你真的想使用它。如果你确定不会有影响...
在方法之外声明任何变量。在没有变量类型的类级别
例如:
{
method()
{
a=10
print(a)
}
// def a or int a wont work
a=0
}
【讨论】:
def sum = 0
// This method stores a value in a global variable.
def add =
{
input1 , input2 ->
sum = input1 + input2;
}
// This method uses stored value.
def multiplySum =
{
input1 ->
return sum*input1;
}
add(1,2);
multiplySum(10);
【讨论】:
无法弄清楚你想要什么,但你需要这样的东西吗? :
def a = { b -> b = 1 }
bValue = a()
println b // prints 1
现在bValue 包含b 的值,它是闭包a 中的一个变量。现在你可以用bValue 做任何事情如果我误解了你的问题,请告诉我
【讨论】: