这是来自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"
我如何复制此行为,以及它的技术术语是什么?
答案 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 }
的对象的字符串时它才有效。我建议添加一些验证或类型转换,或者至少是可靠的文档来解释模块的具体用例。