7

只是想知道,有没有办法在 Ruby 中使用宏来像 C 那样进行文本替换?

例如:

define ARGS 1,2
sum(ARGS) # returns 3

编辑:更具体地说,我的问题看起来更像:

@button1 = FXButton.new(self, "Button 1",:opts => BUTTONPROPERTIES,:width => width, :height => height)
@button2 = FXButton.new(self, "Button 2",:opts => BUTTONPROPERTIES,:width => width, :height => height)
@button3 = FXButton.new(self, "Button 3",:opts => BUTTONPROPERTIES,:width => width, :height => height)

理想情况下,我希望代码看起来像:

@button1 = FXButton.new(self, "Button 1", ALLBUTTONPROPERTIES)
@button2 = FXButton.new(self, "Button 2", ALLBUTTONPROPERTIES)
@button3 = FXButton.new(self, "Button 3", ALLBUTTONPROPERTIES)

请注意,如果我只是将它们设置为某个预定值,我的“宽度”和“高度”变量将无法正确传递给 FXButton 类的初始化。是否有某种代码替换可以解决这个问题?

4

4 回答 4

10

你不需要宏。只需定义一个变量或常量。

A = [1, 2]
A.inject(:+) # => 3

编辑您的问题后

你可以这样做:

ALLBUTTONPROPERTIES = ->{{opts: => BUTTONPROPERTIES, width: width, height: height}}

在常量和变量BUTTONPROPERTIES, width,height被赋值的上下文中,执行以下操作:

@button1 = FXButton.new(self, "Button 1", ALLBUTTONPROPERTIES.call)
@button2 = FXButton.new(self, "Button 2", ALLBUTTONPROPERTIES.call)
@button3 = FXButton.new(self, "Button 3", ALLBUTTONPROPERTIES.call)
于 2013-06-14T13:54:14.517 回答
7

您尝试做的事情可能还有另一种方法。预处理器宏没有意义,因为 Ruby 不是编译语言,它是解释语言。

特别是对于您的示例,有一种非常干净的方法可以做到这一点:

args = [1, 2]
sum(*args) # equivalent to sum( 1, 2 )
于 2013-06-14T13:59:12.777 回答
7

ruby 没有预处理,宏没有意义。只需使用字符串常量或您需要的任何其他类型的常量。

于 2013-06-14T13:54:05.940 回答
4

Ruby 解决问题的方法可能与您的方法有点不同:

@buttons = ["Button 1", "Button 2", "Button 3"].map do |name|
  FXButton.new(self, name,
               :opts => BUTTONPROPERTIES,
               :width => width,
               :height => height)
end

在此示例中,您没有@button1, @button2,@button3变量。取而代之@buttons的是包含所有三个的数组。

于 2013-06-14T15:00:21.017 回答