繁体   English   中英

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

[英]How to create a Ruby string within a CocoaPod PodSpec?

在pod规范中重用字符串有一个常见的技巧:

  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代码注入到规范中,但我现在找不到它,即使我不能确定它解决了我正在尝试做的事情。

所以,我的问题是,这是否可能,如果是这样,我该如何实现呢?

您缺少.to_s电话。 我创建了一个示例podspec来重现您的问题。 的确,:

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

没有通过lint传递验证,我有很多错误。 但是,我添加了to_s调用,它对我v1.0.0lint开始获取我的v1.0.0标记。

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

希望能帮助到你。

首先,我想提供一个替代答案。 而不是使用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实际上使用参数cb上调用方法+ (是的,这是Ruby中的有效方法名称),因此它实际上与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来获得一个,这就是原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM