【问题标题】:Confusion with call to "puts" in ruby对红宝石中“puts”的调用感到困惑
【发布时间】:2013-01-25 18:23:36
【问题描述】:

我们都知道在 ruby​​ 中的 .带有. 左侧对象的运算符有助于发送消息(. 右侧)。

有了上面的原理,这里有了这个-"100".to_s,我们可以说.操作符正在向对象to_s发送消息100。不错!

那么puts("hello") 呢?以下是我向当地红宝石专家提出的问题:

  1. .运营商?

  2. 这里的接收者是谁?

【问题讨论】:

  • 专业提示:仅对代码使用反引号。
  • “仅用于突出目标” - 不要。而是使用清晰简洁的措辞,这样目标就很明显,不需要强调。
  • 您不能要求或反对赞成票或反对票。用户按照自己的意愿去做。无论你问什么问题,它都不会只属于你。这里的任何问题都是为了让未来的读者从中有所收获。
  • Sergio 已经建议了:use clear and concise wording, so that objectives are obvious and don't need to be highlighted. 你没有。所以我为你编辑了这个问题。每个人都可以编辑其他人的帖子是有原因的。
  • @phant0m:“每个人都可以编辑其他人的帖子”——当然,前提是一个人有足够的代表。我们不希望一群 1-rep 用户左右编辑帖子:)

标签: ruby


【解决方案1】:

接收者被省略,在那个上下文中是self。因此,. 也被省略了。 puts 是Kernel 上的一个方法,无论接收者是什么,它都可以访问puts,因为Kernel 包含在任何具有实例的类中。

【讨论】:

  • 接收者不一定是main。是隐含的自我。在 IRB 会话的顶层是main,是的。但是puts 无处不在,main 不是self 无处不在:)
  • 更实用的答案,是的,不像-对不起!
  • 我认为这个答案确实会给未来的读者带来困惑。
  • @TheMiddleMan 以什么方式?
  • @TheMiddleMan 我不认为这会导致“混乱”。
【解决方案2】:

在这种情况下,接收者是隐含的self。 puts 是 Kernel 的一个方法。所有类都包含内核模块,因此 所有 对象都有一个 puts 方法。唯一的事情是:它是私人的。私有方法只能使用隐式self(或使用send)调用

puts 'foo' # >> foo
1.puts 'bar' # ~> -:3:in `<main>': private method `puts' called for 1:Fixnum (NoMethodError)


1.send :puts, 'bar' # >> bar

【讨论】:

  • 像往常一样,你是最棒的,来自核心平台。
  • 您能解释一下您在此处使用的1.puts 和1.send 的技术吗?你到底想向我展示什么?但我的不好:(我不明白。
  • 这是答案的例证。 puts 是所有对象的私有方法。您不能像调用公共方法一样调用私有方法。就是这样。
  • 另外,Object#send上的文档
  • 今天有人问了关于.send 的好问题stackoverflow.com/q/14793048/1136008
猜你喜欢
  • 1970-01-01
  • 2017-07-31
  • 2011-08-01
  • 1970-01-01
  • 2021-04-27
  • 2012-07-27
  • 2019-09-13
  • 2012-07-22
  • 2013-05-13
相关资源
最近更新 更多