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
解决方案
以下代码行导致了几个问题
@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"
推荐阅读
- javascript - javascript:如何检查是否在上下文菜单新选项卡上单击了链接
- php - 连接两个与用户相关的模型 - Laravel
- javascript - 使用 SnapSVG 在拖动时旋转对象
- python - 棉花糖模式的动态类变量?
- unity3d - Unity:来自多个相机的组合图片
- wpf - WPF 控件应脱离父级的剪切框
- html - 元素“link”上属性“href”的错误值“”:必须为非空
- java - react-native run-android FAILURE:构建失败并出现异常
- javascript - Unite Gallery 如何在调整大小时从右到下更改网格位置?
- ios - 我想使用目标 c 将带有其他参数的图像上传到服务器