我在 ruby?? 類中看到一些人使用_前綴來定義實體變數,@_property而在正常情況下attr_writer使用正常名稱@property來定義實體變數。
這樣做有什么意義,有什么區別?
uj5u.com熱心網友回復:
該_前綴是不是一種語言功能,它不會做什么特別的,它僅僅是一個慣例。
大多數情況下,開發者希望表明一個變數沒有被使用,例如一個塊中沒有使用的變數。或者他們想表明該變數是模塊或 gem 的內部變數,其他人不應直接讀取或修改此變數。
uj5u.com熱心網友回復:
根據變數的型別,這里有 2 個可能的答案。
實體變數
當_用于為實體變數添加前綴(如您的問題中)時,通常只是一種約定,以明確該實體變數是私有實作細節,不應在當前范圍之外使用。您可能會遇到它,尤其是在要包含在其他一些類中的模塊中 - 在這種情況下,實體變數由該模塊定義和使用,但它屬于物件本身并限定于物件本身。我個人更喜歡物件范圍的注冊表,但“私有”實體變數是一種快速、骯臟和流行的方式。Alos,為實體變數名稱添加前綴_可以減少名稱沖突的機會。
# Library code
module SomeExternalLibraryModule
def foo
@_something ||= SomeExternalLibraryModule::Something.new(self)
end
end
# Application code
class User
include SomeExternalLibraryModule
attr_reader :something # name conflict "avoided"! Phew!
def bar
@_something.do_sth
# "_" means - you'd better know what you're doing here!
# There is no guarantee that instance variable will be present in the future release
end
end
區域變數
當區域變數以_this為前綴時,意味著該變數未在代碼中使用。在使用迭代器或使用您只對其中一個感興趣的其他多元素輸入時,它特別有用。
僅將其_視為變數名是很常見的。它對決議器有一點特殊的意義,那就是你明確地說“我不在乎那是什么”。因此,它是唯一允許在單個定義中多次使用的引數名稱:
def foo(_, _, a)
a
end
foo(1,2,3) #=> 3
def bar(a,a,b); end #=> SyntaxError
但是,這通常是在名稱中使用“我不在乎”的最佳做法,如果您確實決定需要使用其他引數,這將使您將來的生活更輕松:
def foo(_name, _html_options, options)
options.delete(:some_option)
super
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/378829.html
