ประเด็นหนึ่งที่ฉันไม่เห็นพูดถึงอย่างชัดเจน (ถึงแม้ว่าจะไม่เป็นเช่นนั้น) ก็คือสแควร์รูทสามารถคิดได้ว่าเป็นการดำเนินการ "ที่ได้รับ": หากการดำเนินการไม่ได้จัดเตรียมไว้ให้เราเราสามารถเขียนของเราเองได้
เนื่องจากคำถามถูกแท็กด้วยการออกแบบภาษาเราอาจพิจารณาคำอธิบายเกี่ยวกับผู้ไม่เชื่อเรื่องภาษา แม้ว่าหลาย ๆ ภาษาจะมีปรัชญาที่แตกต่างกัน แต่ก็เป็นเรื่องธรรมดามากที่จะใช้กระบวนการห่อหุ้มเพื่อรักษาค่าคงที่ไว้; เช่นเพื่อหลีกเลี่ยงการมีค่าที่ไม่ทำงานตามประเภทของมันจะแนะนำ
ตัวอย่างเช่นถ้าเรามีการใช้จำนวนเต็มโดยใช้คำเครื่องเราอาจต้องการแค็ปซูลการแทนอย่างใด (เช่นเพื่อป้องกันบิตกะจากการเปลี่ยนเครื่องหมาย) แต่ในเวลาเดียวกันเรายังต้องเข้าถึงบิตเหล่านั้นเพื่อดำเนินการเช่น การเพิ่ม
บางภาษาอาจใช้สิ่งนี้กับคลาสและวิธีการส่วนตัว:
class Int {
public Int add(Int x) {
// Do something with the bits
}
private List<Boolean> getBits() {
// ...
}
}
บางส่วนมีระบบโมดูล:
signature INT = sig
type int
val add : int -> int -> int
end
structure Word : INT = struct
datatype int = (* ... *)
fun add x y = (* Do something with the bits *)
fun getBits x = (* ... *)
end
บางคนมีขอบเขตคำศัพท์:
(defun getAdder ()
(let ((getBits (lambda (x) ; ...
(add (lambda (x y) ; Do something with the bits
'add))
และอื่น ๆ อย่างไรก็ตามไม่จำเป็นต้องใช้กลไกเหล่านี้สำหรับการติดตั้งสแควร์รูท: มันสามารถนำมาใช้โดยใช้ส่วนต่อประสานสาธารณะประเภทตัวเลขและด้วยเหตุนี้มันไม่จำเป็นต้องเข้าถึงรายละเอียดการใช้งานห่อหุ้ม
ดังนั้นที่ตั้งของสแควร์รูทจึงเกิดขึ้นตามปรัชญา / รสนิยมของภาษาและของผู้ออกแบบห้องสมุด บางคนอาจเลือกที่จะนำมัน "ภายใน" ค่าตัวเลข (เช่นทำให้มันเป็นวิธีการเช่น) บางคนอาจเลือกที่จะวางมันไว้ที่ระดับเดียวกับการดำเนินงานดั้งเดิม (ซึ่งอาจหมายถึงวิธีการเช่นหรือมันอาจหมายถึงการมีชีวิตอยู่นอกค่าตัวเลข แต่ภายในโมดูล / คลาส / เนมสเปซเดียวกันเช่นฟังก์ชั่นแบบสแตนด์อโลนหรือวิธีการคงที่) บางคนอาจเลือกที่จะใส่ไว้ในชุดของฟังก์ชั่น "ผู้ช่วย" บางคนอาจเลือกที่จะมอบหมายให้ห้องสมุดของบุคคลที่สาม
1.sqrt()
ใช้ได้ไหม