为什么在这里使用force_encoding(“BINARY”)?

时间:2015-04-22 03:43:36

标签: ruby

当我们安装Rails时,我们会得到rails"可执行文件":

#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'railties' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'

version = ">= 0"

if ARGV.first
  str = ARGV.first
  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
    version = $1
    ARGV.shift
  end
end

gem 'railties', version
load Gem.bin_path('railties', 'rails', version)

我想知道在{String}上做force_encoding("BINARY")的重点是什么。 force_encoding有必要提供哪些可能的值?我认为人们只会在这里使用数字和字母指定版本。

1 个答案:

答案 0 :(得分:2)

这不是特定于rails的东西 - 它是rubygems将为gem中的任何ruby可执行文件生成的包装器。在6bf71914

中添加了对force_encoding的调用

更改的原因是第一个参数可能根本不是一个版本 - 我们想测试它是否是一个版本,但它可能是任何东西,我们不希望正则表达式检查爆炸。例如,某些可执行文件接受文件名列表作为参数,并且这些文件名在ruby使用的默认外部编码中可能无效。

有关issue的更多讨论促使了这一变化。