gpt4 book ai didi

ruby - 什么样的名称对于 Ruby 方法是合法的?

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:18 25 4
gpt4 key购买 nike

this article ,它使用以下方法。

h = {}
def h.[]=(k, v)
puts "Setting hash key #{k} with #{v.inspect}"
super
end

# 1. The standard ||= approach
h[:x] ||= 10
h[:x] ||= 20
...

我知道这是 =( ) 部分的 setter。

def noise=(noise)
@noise = noise
end

Q1。但我不确定 .[] 部分在做什么。

Q2。能否在 Ruby 方法名称中使用 [] 或其他非字母表?

最佳答案

Q1. But I am not sure what .[] part is doing.

在 Ruby 中几乎一切都是对象,我们可以在任何对象上定义方法。所以[]=是定义在Ruby中的Hash类(对象)上的方法,就像+-是数字(也是对象)上的方法一样:

> 4 + 5
# => 9

> 4.+(5)
# => 9

> 10.-(3)
# => 7

同样,我们可以为定义它的对象(如数组)调用 .[].[]= 方法:

> arr = ['hi', 'there', 'welcome', 'to', 'StackOverflow']
> arr.[](3)
# => "to"

或者喜欢你的哈希:

> hash = {:name => 'Bob', :age => 27}
> hash[:name]
# => "Bob"

> hash[:name] = 'Steve'
# => "Steve"

同样,Ruby 允许我们将方法放在任何对象上,并且(几乎)一切都是 Ruby 中的对象。所以我们可以在任何我们喜欢的类上定义 .[] 方法:

> class Foo
> def [](arg)
> arg
> end
> end
> Foo.new[456]
> # => 456

由于对象的实例也是对象,我们可以将该方法定义为仅针对特定实例:

> h = {}           # a Hash instance
> def h.[](arg) # we're giving this instance a new method
> "received #{arg}"
> end
> h[123]
# => "received 123"

同一类的其他实例不会获得该实现:

> {:foo => :bar}[123]   # other Hash instances don't have this method,
# so they're using the default Hash#[] method
# => nil

.[] 在某一方面是一种特殊情况,因为我们允许您跳过括号并将参数放在括号内:

> arr[3] == arr.[](3)
# => true

Q2. Can you use [] or other non-alphabets in a Ruby method name?

不,您不能在任意 Ruby 方法的名称中使用 []。这是一个运算符(如上例中的 +-)。

您只能重载特定的运算符,即(按优先顺序列出):

  • ! , ~ , + (一元)
  • **
  • -(一元)
  • * , / , %
  • + , - (二进制)
  • << , >>
  • &
  • | , ^
  • < , <= , => , >
  • =====!==~!~<=>

否则,Ruby 方法可以包含字母数字 Unicode 字符和下划线的任意混合。 (我在这里松散地使用“字母数字”——Ruby 在它允许的方面非常自由,一般来说,任何没有被语言保留以标记事物的字符都可以工作。)它可以选择以 单个 !? ,并且不能以数字开头。

所以这些是有效的方法名称:

  • present?
  • valid_user?
  • replace!
  • replace
  • 更换(但您可能应该使用 A-Z 拉丁字母表来命名您的方法,这样开发人员就不会讨厌您)
  • ❨╯°□°❩╯︵┻━┻
  • ┬─┬ノ❨º_ºノ❩
  • replace_all

  • REPLACE_1

  • REPLACE_ALL

请注意,虽然最后两个是有效的方法名称,但按照惯例,Ruby 开发者通常为常量保留全大写标识符,而不是方法。

关于ruby - 什么样的名称对于 Ruby 方法是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24114185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com