何时使用 def - groovy shell

问题描述 投票:0回答:1

我对大量使用 Groovy 的 nextflow 很陌生。我正在学习 groovy 来学习闭包,以便可以在 nextflow 中学习和实现。我有一小段代码,我正在尝试在 groovy shell 中打印并执行它。

f_name="MM-265-DNA-T-01-01_L003_R1_001.fastq.gz"
matcher = f_name =~ /^(MM-\w+)-DNA-(\w+)-.*_L(\d+).*$/
def (_, sample_id, sample_type, lane) = matcher[0].findAll()

当我尝试打印sample_type时,它不会打印

sample_id
并给我一个错误
Unknown property: sample_id

我尝试过以下方法来打印样本 ID 但失败:

“${sample_id}”
“$sample_id”
${sample_id}
$sample_id

如果我使用

(_, sample_id, sample_type, lane) = matcher[0].findAll()
,代码可以正常工作,但为什么它不能与
def
一起工作?
我从我的另一篇文章中得到这个https://bioinformatics.stackexchange.com/a/21339/862

groovy closures nextflow
1个回答
0
投票

您的 Groovy 代码本身没问题,但如果将该代码移动到

workflow
块内,Nextflow 将引发错误。我有时会看到这样的错误,这可能是这里的问题:

ERROR ~ Script compilation error
- file : main.nf
- cause: Variable `matcher` already defined in the process scope @ line X, column Y.

我们可以将示例简化为:

workflow {

    foo = 'foooooooo'

    def bar = foo
}

结果:

ERROR ~ Script compilation error
- file : main.nf
- cause: Variable `foo` already defined in the process scope @ line 5, column 15.

我认为这与 Nextflow 如何(内部)跟踪全局变量的使用有关1。这个错误是相当意外的,但对于 Nextflow 开发人员来说,它是否是一个错误或功能将是一个问题。目前尚不清楚(至少对我而言)是否应将赋值运算符右侧的变量添加到引用变量集中。

无论如何,解决方案是更喜欢使用

def
关键字的局部变量:

workflow {
    
    def f_name = "MM-265-DNA-T-01-01_L003_R1_001.fastq.gz"
    def matcher = f_name =~ /^(MM-\w+)-DNA-(\w+)-.*_L(\d+).*$/
    
    def (_, sample_id, sample_type, lane) = matcher[0].findAll()

    println(sample_id)
    println(sample_type)
    println(lane)
}

结果:

MM-265
T
003
© www.soinside.com 2019 - 2024. All rights reserved.