红宝石。我可以为if方法添加别名吗?

时间:2014-04-25 20:17:55

标签: ruby

我想做一些像

这样简单的事情
alias set_then_do if

,因为

if x=true
    puts "x is #{x}"
end

的工作原理。但是每个查看代码的人都会本能地想要将单个等号符号更改为两个('='到'==')。仅仅因为if字。但我希望在不混淆代码阅读器的情况下完成任务。所以我想要以下内容:

alias set_then_do if

set_then_do x=true
    puts "x is #{x}"
end

我正在使用Ruby 1.9.3


回答问题的原因;这是我的样本案例。

if http.use_ssl = @use_ssl # ASSIGNMENT! NOT TESTING EQUALITY!
     http.verify_mode = OpenSSL::SSL::VERIFY_PEER
     http.verify_depth = 9
end

这符合我的美学:

http.use_ssl = @use_ssl; if @use_ssl
     http.verify_mode = OpenSSL::SSL::VERIFY_PEER
     http.verify_depth = 9
end

我仍然愿意回答别名if方法^ _ ^

2 个答案:

答案 0 :(得分:4)

if不是一种方法;这是一个关键字。 Ruby没有提供任何修改语法的工具,所以你不能这样做。

答案 1 :(得分:2)

我将以免责声明开头,我不建议这样做。但是,正如Chuck指出的那样,你不能做你想做的事,但你可以得到"关闭"。

此外,我同意set_then_do是一个糟糕的名字,你可能想要一个不同的名字。也许do_if代替。

说了这么多,你可以在全局名称空间中创建以下函数:

def do_if(val, &block)
  yield if val
end

然后你想要使用它,你可以这样做:

do_if(http.use_ssl = @use_ssl) do
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.verify_depth = 9
end

同样,我不会推荐任何一种,但它确实接近你想要的。