Ruby中的宏?

the*_*odd 6 ruby macros

只是想知道,有没有办法在Ruby中使用宏,以C的方式进行文本替换?

例如:

define ARGS 1,2
sum(ARGS) # returns 3
Run Code Online (Sandbox Code Playgroud)

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

@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)
Run Code Online (Sandbox Code Playgroud)

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

@button1 = FXButton.new(self, "Button 1", ALLBUTTONPROPERTIES)
@button2 = FXButton.new(self, "Button 2", ALLBUTTONPROPERTIES)
@button3 = FXButton.new(self, "Button 3", ALLBUTTONPROPERTIES)
Run Code Online (Sandbox Code Playgroud)

注意如果我将它们设置为某个预定值,我将如何将"width"和"height"变量传递给FXButton类的初始化.是否有某种代码替换可以解决这个问题?

saw*_*awa 9

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

A = [1, 2]
A.inject(:+) # => 3
Run Code Online (Sandbox Code Playgroud)

编辑完问题后

你可以这样做:

ALLBUTTONPROPERTIES = ->{{opts: => BUTTONPROPERTIES, width: width, height: height}}
Run Code Online (Sandbox Code Playgroud)

并且其中常量和变量范围内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)
Run Code Online (Sandbox Code Playgroud)


izo*_*ica 7

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


Sho*_*hoe 7

可能还有另一种方法可以解决你想要做的事情.预处理器宏没有意义,因为Ruby不是编译语言,它是一种解释语言.

特别是对于你的例子,有一个非常干净的方法:

args = [1, 2]
sum(*args) # equivalent to sum( 1, 2 )
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是我收到的最佳答案.几乎就是我正在寻找的东西. (2认同)
  • +1提供简单而有用的答案. (2认同)
  • 我没有对你进行投票,但我相信这一事实可能来自于你的陈述表明(1)语言被编译或解释,以及(2)解释语言不能有预处理器这一事实.这些都不是真实的陈述.可以编译任何可以解释的语言,并且没有理由通常解释的语言不能使用预处理器.许多功能语言,如Racket,Scheme和其他LISP方言,都可以发挥很大的作用; 他们强大的宏的能力是使他们自己如此强大的一部分. (2认同)