Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby';使用连字符替换命名参数_Ruby_Svg_Named Parameters - Fatal编程技术网

Ruby';使用连字符替换命名参数

Ruby';使用连字符替换命名参数,ruby,svg,named-parameters,Ruby,Svg,Named Parameters,我经常需要生成SVG文件,我喜欢使用Ruby的Nokogiri。Nokogiri的好处在于,它允许您创建属性,并将散列传递给它们的“函数”,如下所示 这很好。有一些属性带有连字符:在这种情况下,您可以利用Ruby的强大功能,执行以下操作 doc.rect(:x => 0, :y => 0, :width => 100, :height => 100, :stroke => 'black', 'stroke-width' => 3) 一切都相对顺利。输入Rub

我经常需要生成SVG文件,我喜欢使用Ruby的Nokogiri。Nokogiri的好处在于,它允许您创建属性,并将散列传递给它们的“函数”,如下所示

这很好。有一些属性带有连字符:在这种情况下,您可以利用Ruby的强大功能,执行以下操作

doc.rect(:x => 0, :y => 0, :width => 100, :height => 100, :stroke => 'black', 'stroke-width' => 3)
一切都相对顺利。输入Ruby 2.0和命名参数。我更喜欢这种语法,它更简洁,更像Smalltalk,我喜欢。但是,现在创建连字号属性的唯一方法是混合使用这两种方法,前提是将“哈希”放在命名参数之后(我假设必须这样做,但我没有检查)。无论如何,这是丑陋的

有没有什么方法可以让聪明的人想出使用命名参数语法创建连字符属性

编辑:为了澄清,命名参数如下所示:

doc.rect(x: 0, y: 0, width: 100, height: 100)
使用其中一个

'stroke-width'.to_sym

两者都计算为符号。实际上,由于命名参数只是从新的ruby2哈希表示法派生语法,您仍然可以混合使用这两种语法,如:

params = { named: 'Param1', :'old-style' => 'Param2' } 
因此:

doc.rect x: 0, y: 0, :'stroke-width' => 3

这只是语法糖,里面是一个众所周知的老好散列。顺便说一句,没有办法省略包含
\W
s的键的哈希火箭。

这是不可能的。连字符在标识符中不合法


想一想:您如何知道
a-b
是指标识符
a-b
还是
a
减去
b

如何使用命名参数语法?你能给出一个你打算编写的带有命名参数的方法的例子吗?@uri agassi我通过编辑问题澄清了这个问题。这不是(也被称为,它是新的(ish),在ruby 1.9.2中引入的…我明白了。新的(ish)语法让我有点困惑,但现在一切都讲得通了。谢谢你的澄清。不过,这不是我要问的问题。我要问的问题是如何使用命名参数,通过Nokogiri将XML属性连字符。我粘贴的第二行已经起作用了,我怀疑Ruby已经解决了这个问题。
:“stroke-width”
可能是命名的名称参数。它是一个符号,而
'stroke-width'
是一个字符串。要么我不明白你的问题是什么,要么你没有意识到字符串和符号之间的区别。符号不是命名参数。它已经像那样使用了一段时间,但Ruby 2.0有正确的命名参数。请参阅对我原始问题的编辑。啊,对不起,g既然命名参数只是从新的ruby2哈希符号派生语法,你仍然可以自由地混合使用这两种语法,比如:
params={name:'Param1',:'old-style'=>'Param2'}
,因此,
doc.rect x:0,y:0,:'stroke-width'=>3
。这只是语法的糖分,里面是一个众所周知的好哈希。我明白了(也要感谢Uri上面的评论:)整个事情有点混乱,但经过一些思考还是有道理的。
params = { named: 'Param1', :'old-style' => 'Param2' } 
doc.rect x: 0, y: 0, :'stroke-width' => 3