【问题标题】:Is there an alternate syntax in Ruby for backticks?Ruby 中是否有用于反引号的替代语法?
【发布时间】:2019-03-21 09:36:04
【问题描述】:

在 Ruby 中你可以使用a + b,相当于a.+(b)

您还可以使用def +(other); end 覆盖+() 方法。

反引号有替代语法吗?我知道这行得通:

class Foo
  def `(message)
    puts '<' + message + '>'
  end

  def bar
    `hello world`
  end
end

Foo.new.bar # prints "<hello world>"

但这不起作用,例如

Foo.new.`hello world`

【问题讨论】:

  • 提示:如果你想用参数调用一个名为foo的方法,你怎么做?
  • bar 是如何工作的?
  • 您必须使用Foo.new.send(:`, "hello_world"),但我认为这不是您尝试执行此操作的原因,而是您尝试安全地解析/评估某些模板。很抱歉,但这可能比您想象的要困难得多。用户仍然可以使用::Kernel.send(:`, 'foo') 或许多其他技巧。
  • @KimmoLehto:没有理由使用send。您可以使用普通的方法调用语法。问题只是 OP 似乎不理解 Ruby 中的普通方法调用是什么样的。
  • @KimmoLehto:使用send 实际上只在irb 中使用。正如@JörgWMittag 所说,它在没有sendrb-file 中工作正常@

标签: ruby operator-overloading operators backticks


【解决方案1】:

.+ 和反引号没有区别

从上下文来看,messageString。所以用引号。

class Foo
  def `(message)
    puts '<' + message + '>'
  end
end

Foo.new.` 'hello world' #prints <hello world>

由于codestyle优于use parentheses

Foo.new.`('hello world') #prints <hello world>

此代码在rb-file 中完美运行。

有人可能会说它在irb 中不起作用。但是irb 不是灵丹妙药(例如,如果您在行首使用.,而不是最后)。 所以如果你想在irb中使用它,调用它为

Foo.new.send(:`, 'hello world')

【讨论】:

  • 它不起作用,至少在 2.6.1 irb 中。即使是这样,它也不是“反引号的替代语法”。
  • @MarekLipka。它在irb 中不起作用。但是您是否尝试在文件中使用此代码backtricks.rb 然后运行ruby backtricks.rb?有用。我编辑了我的答案。
  • 感谢您澄清这在 irb 中不起作用。我认为这是 irb 的一个缺点,而不是正确的类似方法(而不是类似运算符)的语法。
  • @MarekLipka:众所周知,IRb 会以各种方式被破坏,因为它使用自己的手写的、不太符合 Ruby 的解析器。
猜你喜欢
  • 2015-03-04
  • 2011-08-15
  • 1970-01-01
  • 2019-08-12
  • 2018-11-16
  • 2021-02-25
  • 2014-12-17
  • 2017-07-03
  • 2010-09-11
相关资源
最近更新 更多