【问题标题】:How do I create and access the global variables in Groovy?如何在 Groovy 中创建和访问全局变量?
【发布时间】:2011-09-12 10:49:09
【问题描述】:

我需要在一个方法中将一个值存储在一个变量中,然后我需要在另一个方法或闭包中使用该变量中的该值。我如何分享这个价值?

【问题讨论】:

    标签: groovy


    【解决方案1】:

    在 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.
    }
    

    【讨论】:

    • 只是要注意字段@requires an import.. import groovy.transform.Field
    • funny 试图编辑更改为比第一行,所以想要一个六字符的编辑!
    • 如果您尝试在类定义中使用全局变量,它会变得有点棘手。下面的class Globals 解决方案是一种解决方法。
    • 我使用 Groovy 在 Jenkins 流水线中尝试了 var1 = 'var1' 方法,但没有成功。我不得不使用@Field var1 = 'var1'
    【解决方案2】:
    class Globals {
       static String ouch = "I'm global.."
    }
    
    println Globals.ouch
    

    【讨论】:

      【解决方案3】:
      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 它是全局的

      【讨论】:

        【解决方案4】:

        与所有 OO 语言一样,Groovy 本身没有“全局”的概念(与 BASIC、Python 或 Perl 不同)。

        如果您有多个方法需要共享同一个变量,请使用字段:

        class Foo {
            def a;
        
            def foo() {
                a = 1;
            }
            def bar() {
                print a;
            }
        }
        

        【讨论】:

          【解决方案5】:

          只需在类或脚本范围内声明变量,然后从方法或闭包内部访问它。如果没有示例,很难更具体地解决您的特定问题。

          但是,全局变量通常被认为是错误的形式。

          为什么不从一个函数返回变量,然后将其传递给下一个函数?

          【讨论】:

          • 如果我想使用在闭包中赋值的变量怎么办?例如:我在脚本的开头有 def a = null 。现在在闭包内部,a = 'some string' 的值被赋值。我希望所有其他闭包都可以访问这个新值。谢谢
          • 真的吗?当你不得不尝试修复它时,你会恨自己
          • 我结束了创建一个闭包,它返回所需的计算值并在需要的地方使用
          【解决方案6】:

          我认为您在谈论类级别的变量。 如上所述,使用全局变量/类级别变量不是一个好习惯。

          如果你真的想使用它。如果你确定不会有影响...

          在方法之外声明任何变量。在没有变量类型的类级别

          例如:

          {
             method()
             {
                a=10
                print(a)
             }
          
          // def a or int a wont work
          
          a=0
          
          }
          

          【讨论】:

          • 这可能不是一个干净的方法,但它有效;)谢谢。
          【解决方案7】:
          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);
          

          【讨论】:

            【解决方案8】:

            无法弄清楚你想要什么,但你需要这样的东西吗? :

            ​def a = { b -> b = 1 }
            ​bValue = a()
            println b // prints 1
            

            现在bValue 包含b 的值,它是闭包a 中的一个变量。现在你可以用bValue 做任何事情如果我误解了你的问题,请告诉我

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-12-05
              • 2016-05-04
              • 1970-01-01
              • 2021-01-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多