首页 > 解决方案 > 为什么这个字符串值被转换成一个数组?

问题描述

我有以下功能:

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 x01024value.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

标签: ruby

解决方案


以下代码行导致了几个问题

@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"

推荐阅读