首页 > 解决方案 > Cocoapods RUBY 未定义的局部变量或方法

问题描述

我仍然是 Ruby 的初学者。我正在尝试编写一些额外的代码来处理我们的 50 个目标 Cocoapods 依赖项。

使用以下代码:

testString = "TEST!!!"

def processPods(platform_name)
    project = Xcodeproj::Project.open "./WhiteLabel.xcodeproj"
    project.targets.each { |target| 
        target_name = target.name
        if target.platform_name == platform_name
            puts "Processing #{target_name} for Platform #{platform_name}"
            puts testString #-->Error ...
        end 
    }
end

#Cocoapods methods
abstract_target 'iOS' do
    puts testString #-->Executes
    processPods(:ios)
end

为了这个问题,“testString”替换了一个更大的变量。

当我运行代码时,我得到:

TEST!!!
Processing WhiteLabel for Platform ios

[!] Invalid `Podfile` file: undefined local variable or method `testString' for #<Pod::Podfile:0x00007f8fe11cc2d0>.

 #  from ~/Documents/Developer/Xcode/WhiteLabelApple/Podfile:124
 #  -------------------------------------------
 #              puts "Processing #{target_name} for Platform #{platform_name}"
 >              puts testString
 #          end 
 #  -------------------------------------------

知道为什么吗?

标签: rubycocoapods

解决方案


如果您不想更改变量名,您可以利用 Ruby 块是闭包这一事实;封闭变量可在块内访问。

test_string = "TEST!!!"

process_pods = lambda do |platform_name|
    project = Xcodeproj::Project.open "./WhiteLabel.xcodeproj"
    project.targets.each { |target| 
        target_name = target.name
        if target.platform_name == platform_name
            puts "Processing #{target_name} for Platform #{platform_name}"
            puts test_string #-->Should work ...
        end 
    }
end

abstract_target 'iOS' do
    puts test_string #-->Executes
    process_pods.call(:ios)
end

有时,不可能将变量更改为常量,因为它实际上是变量。因此,将代码放在一个块中提供了一种在不牺牲对周围变量的访问权限的情况下组织代码的方法。


推荐阅读