使用equals处理方法名称中的参数

时间:2014-03-14 11:07:12

标签: ruby

我的方法是:

def title=(text, sub_text = 'another piece of text')
  self.title = text + sub_text
end

我的代码中的其他地方,我做了类似的事情:

subtext = "enhusiasts"
title = "hello ruby "

如何将subtext传递给标题设置器功能,以便我的标题变为:

hello ruby enthusiasts

我是否必须编写一个单独的函数来使用此setter?

2 个答案:

答案 0 :(得分:1)

虽然以=结尾的编写器方法没有什么特别之处,但语言的语法不允许使用多个参数调用它们。您可以使用send

object.send :title=, title, subtext

但这不是一个干净的解决方案。此外,您的title=方法是递归的;你应该直接设置一个实例变量。

我推荐这样的东西:

attr_writer :text, :sub_text

def title
  text + sub_text
end

# ...

object.text = 'hello ruby '
object.sub_text = 'enthusiasts'

object.title
# => "hello ruby enthusiasts"

答案 1 :(得分:0)

您可以使用self.send('title=', 'string1')self.send('title=', 'string1', 'string2')来调用它。

但你不能以通常的方式称呼title = 'string1', 'string2'。那是因为解析器不允许它。如果存在=,则该语句应为identifier = expression格式。

最好不要在这种情况下用=命名你的功能。

同样推荐并且是通过插值来连接字符串的约定,即: self.title = "#{text} #{sub_text}"代替self.title = text + sub_text

这可以防止在文本为零时生成错误。