为什么将此字符串值转换为数组?

时间:2018-07-23 06:32:59

标签: ruby

我具有以下功能:

def parse_var(var)
    value = instance_variable_get(var)
    puts(value)
    puts(value.to_s)
    value.is_a?(Numeric) ? value.to_s : "\"#{value}\""
end

某些形式的变量在插值时会转换为数组。在上面的函数中,当value等于(684) 029-6183 x01024时,value.to_s就是["(684) 029-6183 x01024", nil]。当我尝试"#{value}"时,也会发生同样的事情。

是什么原因造成的?

这是相关代码的上下文:

Entity.rb(以上代码的上下文)

require 'securerandom'

# Entity.rb
class Entity
    def initialize
        generate_uuid
    end

    def to_cypher
        first_char = self.class.name.chr.downcase
        "MERGE (#{first_char}:#{self.class.name} {#{attrs_to_cypher.join(', ')}}) RETURN #{first_char};"
    end

    protected

    def rand_bool
        [true, false].sample
    end

    private

    def attrs_to_cypher
        self.instance_variables.map do |var|
            "#{camelize(var.to_s[1..-1])}:#{parse_var(var)}"
        end
    end

    def generate_uuid
        @uuid = SecureRandom.uuid
    end

    def parse_var(var)
        value = instance_variable_get(var)
        puts(value)
        puts(value.to_s)
        value.is_a?(Numeric) ? value.to_s : "\"#{value}\""
    end

    def camelize(s)
        (s == "uuid") ? "UUID" : s.downcase.split('_').map(&:capitalize).join
    end
end

PhoneNumber.rb(值来自何处)

require 'faker'
require_relative 'Entity'

# PhoneNumber.rb
class PhoneNumber < Entity
    def initialize(**opts)
        super()
        @type         = opts[:type]         || rand_bool ? "cell" : "home"
        @number       = opts[:number]       || @type == "cell" ? Faker::PhoneNumber.cell_phone : Faker::PhoneNumber.phone_number,
        @country_code = opts[:country_code] || nil
        @area_code    = opts[:area_code]    || nil
    end
end

2 个答案:

答案 0 :(得分:2)

以下代码行引起了很多问题

@number = opts[:number] || @type == "cell" ? Faker::PhoneNumber.cell_phone : Faker::PhoneNumber.phone_number,

首先,||运算符的优先级比?运算符高,因此它实际上看起来像:

@number = (opts[:number] || @type == "cell") ? Faker::PhoneNumber.cell_phone : Faker::PhoneNumber.phone_number,

您可能想要这个:

@number = opts[:number] || (@type == "cell" ? Faker::PhoneNumber.cell_phone : Faker::PhoneNumber.phone_number),

就目前而言,传递给opts[:number]的内容并不重要,您将始终获得分配的Faker::PhoneNumber。 (上面的行,分配类型,看起来像是有同样的优先级问题)

第二,在行尾有一个逗号。这会将整行变成数组的第一个元素,并且不会干扰在下一行上分配变量,因此很难理解:

opts = { number: '123' }
type = "cell"
number = opts[:number] || type == "cell" ? "truthy" : "falsey",
country = "some value"

p number  # => ["truthy", "some value"]
p country # => "some value"

答案 1 :(得分:0)

您的变量包含["(684) 029-6183 x01024", nil],而不是字符串。您依靠puts(value)的输出来确定它的值,这是完全错误的:

puts ["(684) 029-6183 x01024", nil]
#⇒ (684) 029-6183 x01024
#

puts(nil)返回一个空字符串,使您认为原始值是一个字符串。

要解决此问题,您可以:

value = [*value].compact.join