คำถามติดแท็ก traits

ในการเขียนโปรแกรมคอมพิวเตอร์ลักษณะคือชุดของวิธีการที่ใช้เป็น "แบบจำลองแนวคิดอย่างง่ายสำหรับการจัดโครงสร้างโปรแกรมเชิงวัตถุ"

11
อะไรคือความแตกต่างระหว่างประเภทย่อยของตนเองและลักษณะย่อย?
ประเภทตนเองสำหรับลักษณะA: trait B trait A { this: B => } บอกว่า" Aไม่สามารถผสมลงในระดับที่เป็นรูปธรรมที่ไม่ยังขยายB " ในทางตรงกันข้ามต่อไปนี้: trait B trait A extends B กล่าวว่า"ใด ๆ (ที่เป็นรูปธรรมหรือนามธรรม) ชั้นผสมในAก็จะได้รับการผสมใน B" ข้อความทั้งสองนี้ไม่ได้มีความหมายเหมือนกันหรือไม่ ดูเหมือนว่าประเภทของตัวเองจะให้บริการเพียงเพื่อสร้างความเป็นไปได้ของข้อผิดพลาดในการรวบรวมเวลาที่เรียบง่าย ฉันพลาดอะไรไป
387 scala  traits  self-type 

8
อะไรคือข้อดีของการใช้คลาสนามธรรมแทนลักษณะ?
อะไรคือข้อดีของการใช้คลาสนามธรรมแทนลักษณะ (นอกเหนือจากประสิทธิภาพ) ดูเหมือนว่าคลาสนามธรรมสามารถถูกแทนที่ด้วยลักษณะในกรณีส่วนใหญ่
371 scala  traits 

4
จะแทนที่ฟังก์ชั่น trait และเรียกมันจากฟังก์ชั่น overridden ได้อย่างไร?
สถานการณ์: trait A { function calc($v) { return $v+1; } } class MyClass { use A; function calc($v) { $v++; return A::calc($v); } } print (new MyClass())->calc(2); // should print 4 รหัสนี้ใช้งานไม่ได้และฉันไม่สามารถหาวิธีที่จะเรียกฟังก์ชั่นลักษณะได้เหมือนว่ามันได้รับมา ฉันพยายามโทรself::calc($v), static::calc($v), parent::calc($v), A::calc($v)และต่อไปนี้: trait A { function calc($v) { return $v+1; } } class MyClass { use …
370 php  traits 

13
ลักษณะเทียบกับส่วนต่อประสาน
ฉันพยายามศึกษาเกี่ยวกับ PHP เมื่อเร็ว ๆ นี้และฉันพบว่าตัวเองติดนิสัยแล้ว ฉันเข้าใจแนวคิดของการนำโค้ดแนวนอนมาใช้ใหม่และไม่ต้องการรับมรดกจากคลาสนามธรรม สิ่งที่ฉันไม่เข้าใจคือ: อะไรคือความแตกต่างที่สำคัญระหว่างการใช้คุณลักษณะกับส่วนต่อประสาน ฉันได้ลองค้นหาโพสต์บล็อกที่ดีหรือบทความที่อธิบายว่าควรใช้อย่างใดอย่างหนึ่ง แต่ตัวอย่างที่ฉันพบจนถึงตอนนี้ดูเหมือนจะคล้ายกันมาก
345 php  interface  traits 

5
ลักษณะที่ผนึกคืออะไร
คลาสที่ปิดผนึกมีการอธิบายไว้ใน 'การเขียนโปรแกรมใน Scala' แต่ลักษณะที่ซีลไม่ได้ ฉันจะหาข้อมูลเพิ่มเติมเกี่ยวกับลักษณะที่ผนึกได้จากที่ไหน ฉันอยากจะรู้ว่าถ้าลักษณะที่ปิดผนึกเหมือนกันกับชั้นเรียนที่ปิดผนึกหรือไม่? หรือถ้าไม่อะไรคือความแตกต่าง? เมื่อไรจึงควรใช้ลักษณะที่ปิดสนิท (และเมื่อไม่)
332 scala  sealed  traits 

3
อะไรคือความแตกต่างระหว่างลักษณะใน Rust และ typeclasses ใน Haskell
ลักษณะใน Rust ดูเหมือนอย่างน้อยที่สุดก็คล้ายกับtypeclassesใน Haskell แต่ฉันเคยเห็นคนเขียนว่ามีความแตกต่างระหว่างพวกเขา ฉันสงสัยว่าความแตกต่างเหล่านี้คืออะไร
157 haskell  rust  traits 

2
Mixins vs. Traits
อะไรคือความแตกต่างระหว่าง Mixins กับลักษณะ? ตามวิกิพีเดียโมดูลทับทิมมีลักษณะเหมือน งั้นเหรอ

5
ลักษณะของ PHP - ตัวอย่าง / แนวทางปฏิบัติที่ดีที่สุดในโลกแห่งความเป็นจริง? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ลักษณะเป็นหนึ่งในสิ่งที่ยิ่งใหญ่ที่สุดสำหรับ PHP 5.4 ฉันรู้ไวยากรณ์และเข้าใจแนวคิดที่อยู่เบื้องหลังคุณลักษณะเช่นใช้โค้ดแนวนอนซ้ำสำหรับสิ่งทั่วไปเช่นการบันทึกการรักษาความปลอดภัยการแคชเป็นต้น อย่างไรก็ตามฉันยังไม่รู้ว่าฉันจะใช้ประโยชน์จากคุณลักษณะต่าง ๆ ในโครงการของฉันอย่างไร มีโครงการโอเพนซอร์ซที่ใช้คุณลักษณะอยู่แล้วหรือไม่? มีบทความ / วัสดุการอ่านที่ดีเกี่ยวกับวิธีการจัดโครงสร้างสถาปัตยกรรมโดยใช้คุณลักษณะ?
148 php  traits 

4
เป็นไปได้หรือไม่ที่จะหาประเภทพารามิเตอร์และประเภทผลตอบแทนของแลมด้า
เมื่อพิจารณาแลมบ์ดาเป็นไปได้ไหมที่จะหาประเภทพารามิเตอร์และประเภทการส่งคืน ถ้าใช่อย่างไร โดยพื้นฐานแล้วฉันต้องการlambda_traitsที่สามารถใช้ในรูปแบบต่อไปนี้: auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long แรงจูงใจเบื้องหลังคือฉันต้องการใช้lambda_traitsในเทมเพลตฟังก์ชันซึ่งยอมรับแลมบ์ดาเป็นอาร์กิวเมนต์และฉันจำเป็นต้องรู้ว่าเป็นประเภทพารามิเตอร์และประเภทผลตอบแทนภายในฟังก์ชัน: template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //... } …

1
วิธีการเริ่มต้น Java 8 เป็นลักษณะ: ปลอดภัยหรือไม่
วิธีปฏิบัติที่ปลอดภัยในการใช้ วิธีการเริ่มต้นเป็นลักษณะเฉพาะของคนยากจนใน Java 8 หรือไม่? บางคนอ้างว่ามันอาจทำให้แพนด้าเสียใจหากคุณใช้มันเพียงเพื่อประโยชน์ของมันเพราะมันเจ๋ง แต่นั่นไม่ใช่ความตั้งใจของฉัน นอกจากนี้ยังมักจะได้รับการเตือนว่ามีการแนะนำวิธีการเริ่มต้นเพื่อสนับสนุนการพัฒนา API และความเข้ากันได้แบบย้อนหลังซึ่งเป็นความจริง แต่สิ่งนี้ไม่ได้ทำให้ผิดหรือบิดเบี้ยวในการใช้เป็นลักษณะเฉพาะ ฉันมีกรณีการใช้งานจริงดังต่อไปนี้ : public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } หรือบางทีกำหนดPeriodTrait: public interface PeriodeTrait { Date getStartDate(); Date getEndDate(); default isValid(Date atDate) { ... } } เป็นที่ยอมรับว่าสามารถใช้องค์ประกอบ (หรือแม้แต่คลาสตัวช่วย) แต่ดูเหมือนว่าจะดูละเอียดและรกกว่าและไม่อนุญาตให้ได้รับประโยชน์จากความหลากหลาย ดังนั้นการใช้วิธีการเริ่มต้นเป็นลักษณะพื้นฐานเป็นเรื่องปกติหรือไม่ปกติหรือไม่หรือฉันควรกังวลเกี่ยวกับผลข้างเคียงที่คาดไม่ถึง? หลายคำถามเกี่ยวกับ SO เกี่ยวข้องกับลักษณะ Java และ …

3
เมื่อใดควรใช้ val หรือ def ในลักษณะ Scala?
ฉันกำลังดูสไลด์สกาลาที่มีประสิทธิภาพและกล่าวถึงในสไลด์ 10 ที่จะไม่ใช้valใน a traitสำหรับสมาชิกนามธรรมและใช้defแทน สไลด์ไม่ได้กล่าวถึงรายละเอียดว่าเหตุใดจึงใช้บทคัดย่อvalใน a traitจึงเป็นการต่อต้านรูปแบบ ฉันจะขอบคุณถ้ามีใครสามารถอธิบายแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับการใช้ val vs def ในลักษณะสำหรับวิธีนามธรรมได้

2
เพราะเหตุใด `std :: mem :: drop` จึงเหมือนกับการปิด | _ | () ในขอบเขตที่สูงกว่า
การใช้งานของstd::mem::dropเอกสารจะเป็นดังต่อไปนี้: pub fn drop<T>(_x: T) { } ดังนั้นฉันจึงคาดหวังว่าการปิด|_| ()(หรือที่รู้จักกันในชื่อการปิดห้องน้ำ ) จะเป็น 1: 1 ที่มีศักยภาพในการทดแทนdropทั้งสองทิศทาง อย่างไรก็ตามรหัสด้านล่างแสดงให้เห็นว่าdropไม่เข้ากันกับลักษณะการจัดอันดับที่สูงกว่าที่ถูกผูกไว้กับพารามิเตอร์ของฟังก์ชั่นในขณะที่การปิดห้องน้ำเป็น fn foo<F, T>(f: F, x: T) where for<'a> F: FnOnce(&'a T), { dbg!(f(&x)); } fn main() { foo(|_| (), "toilet closure"); // this compiles foo(drop, "drop"); // this does not! } ข้อความแสดงข้อผิดพลาดของคอมไพเลอร์: error[E0631]: type mismatch …

4
ฉันจะส่งคืนประเภทที่เชื่อมโยงจากคุณลักษณะที่ถูกจัดอันดับที่สูงกว่าได้อย่างไร
ฉันมีลักษณะที่มีฟังก์ชั่นสำหรับ deserializing ประเภทที่เกี่ยวข้อง อย่างไรก็ตามประเภทที่เกี่ยวข้องนั้นจำเป็นต้องมีอายุการใช้งานที่ผู้โทรตัดสินใจดังนั้นฉันจึงมีคุณลักษณะที่แยกต่างหากซึ่งฉันใช้คุณลักษณะที่มีอันดับสูงกว่าซึ่งผูกไว้กับ ฉันต้องใช้การปิดที่ส่งคืนประเภทที่เชื่อมโยงนี้ ฉันมีรหัสต่อไปนี้เพื่อทำ: #![allow(unreachable_code)] use std::marker::PhantomData; trait Endpoint: for<'a> EndpointBody<'a> {} trait EndpointBody<'a> { type Out: 'a; fn serialize(body: &Self::Out) -> Vec<u8>; fn deserialize(raw_body: &'a [u8]) -> Self::Out; } // ///////////////////////////////////////////////////////// /// Trait object compatible handler trait Handler { fn execute(&self, raw_body: &[u8]) -> Vec<u8>; } /// …

2
ทำไมเมธอดที่ส่งคืนยูนิตสามารถถูกแทนที่ด้วยเมธอดที่ส่งคืนสตริงเมื่อชนิดการส่งคืนไม่ได้รับอย่างชัดเจน?
ฉันกำลังทำงานผ่านตัวอย่างโค้ดจากบทเกี่ยวกับลักษณะในการเขียนโปรแกรมใน Scala Edition1 https://www.artima.com/pins1ed/traits.html และเจอพฤติกรรมแปลก ๆ เพราะพิมพ์ผิดของฉัน ในขณะที่วิธีการลักษณะดังต่อไปนี้รหัสข้อมูลเท่านั้นเอาชนะไม่ได้ให้รวบรวมข้อผิดพลาดใด ๆ แม้ว่าประเภทการกลับมาของวิธีการที่แตกต่างกันแทนที่เป็นVSUnit Stringแต่เมื่อเรียกวิธีการบนวัตถุมันจะส่งคืนหน่วย แต่ไม่ได้พิมพ์อะไร trait Philosophical { def philosophize = println("I consume memory, therefore I am!") } class Frog extends Philosophical { override def toString = "green" override def philosophize = "It aint easy to be " + toString + "!" } …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.