我具有以下功能:
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
答案 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