如何在CocoaPod PodSpec中创建一个Ruby字符串?

4

有一个常见的技巧可以在 pod spec 中重复使用字符串:

  s.version = '0.0.2'
  s.source = { :git => ..., :tag => s.version }

通过在分配后重复使用 s.version 字符串,我无需记住在更新我的 podspec 时更改两个字段。
但是,我真正想做的是使用“v0.0.2”标记我的代码,而不是“0.0.2”。因此,我尝试着通过在版本号前添加“v”来创建一个新字符串:
  s.source = { :git => ..., :tag => 'v' +  s.version }

然而,这会炸掉pod命令。

我记得之前在搜索其他内容时看到一个技巧,可以将Ruby代码注入到规范中,但现在找不到了,即使找到了,也不确定它是否解决了我尝试做的事情。

因此,我的问题是,这是否可能实现,如果可以,我该如何完成?

2个回答

6
你缺少一个 .to_s 调用。我创建了一个示例的 podspec 来重现你的问题。实际上,:
s.source = { :git => ..., :tag => 'v' +  s.version }

使用 lint 进行验证未通过,我收到了许多错误。然而,我添加了 to_s 调用,它对我起作用了,lint 开始获取我的 v1.0.0 标签。

s.source = { :git => ..., :tag => 'v' +  s.version.to_s }

希望这能有所帮助。

太好了!我完全不懂Ruby。s.version是一个字符串,但我必须将其转换为字符串才能创建一个新字符串(你明白我为什么头晕吗!)。在我看来,在Ruby中单引号和双引号差不多 - 如果这不是真的,请添加注释。无论如何,这不是我之前见过的解决方案。哈 - 刚刚看到你主页上的摘要 :-) - 哈哈! - David H

5

首先,我想提供另一种答案。与其使用Ruby字符串连接

'v' + s.version.to_s

你也可以使用Ruby字符串插值,在这种情况下大多数人都会使用它。
"v#{s.version}"

在Ruby中,#{...}类似于Shell脚本或Perl中的${...}。整个表达式都会被代码片段(...)的输出替代,该代码片段可以是变量、方法调用或任何其他代码片段。但这仅适用于双引号中(再一次地,就像在Shell脚本或Perl中一样)。
现在关于OP @DavidH对@RaffAl答案的评论:

我完全不了解Ruby。s.version是一个字符串,但我必须将其转换为字符串才能创建一个新字符串(明白为什么我头晕了吗!)。

Ruby是一种极其动态的语言,在其中一切都是对象,几乎所有的东西都是作为方法实现的,甚至大多数的运算符也是如此。例如:a = b + c 实际上调用了b上的+方法(是的,在Ruby中这是一个有效的方法名),并传入参数c,所以它实际上与a = b.+(c)相同。
当你写:
s.version = '0.0.2'

看起来你只是给一个变量赋值,但实际上会调用setter方法,因为这段代码等同于:

s.version=('0.0.2')

是的,实际上该方法的名称为version=(在Ruby中允许在方法名称中使用特定运算符)。在Java中,该方法很可能被命名为setVersion()。只是因为您将字符串传递给setter并不意味着该字符串也会存储在任何地方。

当您调用时

x = s.version

事实上,您正在调用一个getter方法:

x = s.version()

在Java中,该方法的名称为getVersion()。而且这个getter方法不返回一个字符串,它返回一个Version对象。因此,你的初始代码应该是:
'v' + s.version

实际上是这样的:

'v'.+(s.version)

但问题在于,String类的+方法不知道如何附加Version类的对象,这就是它失败的原因。
所有Ruby类必须继承自另一个类,如果它们没有,则简单地继承自Object类,并且该类定义了一个to_s()方法,因此任何Ruby对象都知道to_s(在Ruby中,圆括号始终是可选的,puts(“ Hello World”)puts“ Hello World”相同)。如果它们没有覆盖它,则打印类名和对象ID的编码,但许多类已经覆盖了此方法以返回更有意义的内容。 Version类将版本作为字符串返回。
好的,那么为什么字符串插值还能工作呢?因为除非#{...}表达式的结果产生一个字符串,否则Ruby会调用该结果的to_s方法来获取一个字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接