使用self作为ruby实例方法中的第一个参数

时间:2016-02-05 15:16:16

标签: ruby-on-rails ruby

这是来自ActiveSupport::Inflector的{​​{3}}:

def dasherize(underscored_word)
  underscored_word.tr('_', '-')
end

它用短划线替换字符串中的下划线。

'puni_puni'.dasherize # => "puni-puni"

接收器用作该方法的唯一参数。

ActiveSupport::Inflector.dasherize(puni_puni) # => "puni-puni"

当我尝试做类似的事情时,它不起作用:

module NewDash
    def new_dasherize(underscored_word)
        underscored_word.tr('_', '-')
    end
end

String.include NewDash

t = "t_e_s_t"
t.new_dasherize # => ArgumentError: wrong number of arguments (0 for 1)
t.new_dasherize(t) # => "t-e-s-t"

我如何复制此行为,以及它的技术术语是什么?

4 个答案:

答案 0 :(得分:5)

尝试写这样的

queryset = UserNotifications.objects.unseen(self.request.user)

def new_dasherize tr('_', '-') end 相同,其中self.tr('_', '-')在这种情况下是self类实例。

答案 1 :(得分:2)

这并不是一种神奇的方式。如果您查看core_ext/string/inflections内部,您可以看到活动支持重新打开String类并执行

Private opened As Boolean

Private Sub WindowEvents_WindowActivated(ByVal GotFocus As EnvDTE.Window, ByVal LostFocus As EnvDTE.Window) Handles WindowEvents.WindowActivated
    If GotFocus.Document Is Nothing Then
        Return
    End If
    If GotFocus.Document.FullName.EndsWith(".cs") And opened = True Then
        DTE.ExecuteCommand("Edit.CollapsetoDefinitions")
    End If
    opened = False
End Sub

Private Sub DocumentEvents_DocumentOpened(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentOpened
    opened = True
End Sub

答案 2 :(得分:1)

您可以通过几种不同的方式完成此操作。 LcLk提到了一种方法,将self设置为参数列表中underscored_word的默认值。另一种方式是直接引用自我

module NewDash
  def new_dasherize
    self.tr('_', '-')
  end
end

String.include NewDash

运行之后,您可以直接在字符串本身上调用new_dasherize

>> 'puni_puni'.new_dasherize
=> "puni-puni"

使用此

,您可以实现完全相同的ActiveSupport样式
class String
  def new_dasherize
    self.tr('_', '-')
  end
end

这就是ActiveSupport的作用,打开String类(check it out)并使用某些方法。他们恰好将此dasherize方法的实施委托给ActiveSupport::Inflections

如果您查看Here,您会看到ActiveSupport实际执行dasherize方法的位置。

技术术语可能是“扩展一个对象”,尽管我对此并不乐观。

答案 3 :(得分:0)

我不确定执行此操作的传统方式是什么,但您实际上要查找的是将t作为new_dasherize的可选参数,并为其指定默认值当self未提供时,module NewDash def new_dasherize(underscored_word = self) underscored_word.tr('_', '-') end end

self

这是一个相当无意义的默认值,因为只有当tr是一个响应firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: pattern: ~ anonymous: ~ internal_api: provider: fos_userbundle check_path: /api/user/login logout: path: /api/user/logout access_control: - { path: ^/api/init, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/api/resources, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/, roles: ROLE_USER } 的对象的字符串时它才有效。我建议添加一些验证或类型转换,或者至少是可靠的文档来解释模块的具体用例。