我无法在使用 Swift 包管理器创建的 Swift 项目中运行单元测试(即,包管理器创建的任何单元测试......我在 Xcode 中创建的那些在 Xcode 中工作正常)。我在包管理器生成的所有项目上都遇到相同的错误。为了简单起见,我尝试了一个非常基本的测试项目,对默认设置进行了尽可能少的修改,但仍然出现错误。以下是重现的步骤:
swift package init --type executable(模块名称为Hello)创建一个新项目swift package generate-xcodeprojimport Foundation
let message = "Hello, world!"
print(message)
Run Code Online (Sandbox Code Playgroud)
import XCTest
@testable import Hello
class HelloTests: XCTestCase {
func testExample() {
XCTAssert(message == "Hello, world!")
}
static var allTests = [
("testExample", testExample),
]
}
Run Code Online (Sandbox Code Playgroud)
swift buildand构建并运行良好swift run Hello …问题:我从一个方法中得到一个“XXXXXXX 下降到这里仍然借用”错误,其中 XXXXXXX 在方法结束时有效(这很好),但是 Rust 不必要地期望它只要输入引用就可以存活因为那些有明确的生命周期。
这是一些设置信息:我有一个结构体,它在文本内容中迭代所有找到的查询。
pub struct QueryRangeItr<'a> {
inverted: bool,
query: &'a str,
content: &'a str,
}
Run Code Online (Sandbox Code Playgroud)
它需要查询和内容的引用,并期望实例与查询/内容一样长。到现在为止还挺好。
impl<'a> QueryRangeItr<'a> {
fn new(query: &'a str, content: &'a str, inverted: bool) -> QueryRangeItr<'a> {
Self {
inverted,
query,
content,
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个静态方法,允许您对每个找到的查询执行转换。它接受一个闭包并将其应用于查询,然后为您提供一个String没有生命周期依赖的 new 。因为返回值没有生命周期,我实际上并不想在这里为查询和内容带来生命周期,但如果我不这样做,Rust 告诉我我需要......因此,它们有生命周期要求。就其本身而言,这很好用。
问题发生在另一个静态方法上,该方法调用transform两次以转换查询和非查询内容。它首先调用transfrom对找到的查询应用一个闭包。结果将反馈到该transform方法的另一个调用,但这次将转换应用于其余内容。
impl<'a> QueryRangeItr<'a> {
pub fn transform<T>(
query: &'a str,
content: &'a str,
transform: T,
inverted: bool,
) -> String …Run Code Online (Sandbox Code Playgroud)