Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaºÍRustÔÚʵÏÖ¶àÏ̱߳à³ÌʱµÄÒìͬ
 
×÷ÕߣºÇ®Êï¹â À´Ô´£ºCSDN ·¢²¼ÓÚ 2015-8-28
  2556  次浏览      27
 

Õâ¸öÌâÄ¿ÊÇÏ£Íû³ÌÐòÔ±Äܹ»ÓÃÉú²úÕߺÍÏû·ÑÕßÕâÑùµÄģʽÀ´½â¾öÆ¥ÅäµÄÎÊÌâ¡£ÔÚÎÒµÄJavaºÍRustµÄʵÏÖÀ¶¼ÊÇ·ÖΪÕâô¼¸¸ö¶ÔÏó£ºdancetype£¬leader£¬follower£¬invitation¡£ÆäÖÐleader¾ÍÏ൱ÓÚÉú²úÕߣ¬follow¾ÍÏ൱ÓÚÏû·ÑÕߣ¬invitation¾ÍÊÇÖм䴫µÝµÄÏûÏ¢¡£Õû¸ö³ÌÐòµÄ˼·¾ÍÊÇ£ºleaderͨ¹ý·¢ËÍinvitation¸øfollower£¬folower¸ù¾Ý×Ô¼ºÆ¥ÅäµÄÇé¿ö·µ»Ø½á¹û¸øleader£¬½ÓÊÜ»òÕ߾ܾø¡£

JavaµÄʵÏÖ

´ò¿ªFollower.javaÀïµÄÕâ¸öº¯Êý

ÕâÀïµÄFollower.this.invitations¾ÍÊÇÎÒÃǵÄÏûÏ¢¶ÓÁУ¬¶¨ÒåÊÇ£ºprivate LinkedList<Invitation> invitations;LinkedList²»ÊÇÏßÐÔ°²È«µÄ¼¯ºÏ£¬ÐèÒªÎÒÃǼÓͬ²½¡£¾ßÌåµÄͬ²½·½·¨¾ÍÊǺ¯ÊýÀïдµÄ£¬Í¨¹ýJava³£¼ûµÄÓÃwait£¬notifyºÍnotifyall¸ø¶ÔÏó¼ÓËø¡£

´¦Àí²¢·¢ÓÐwait¡¢notifyºÍnotiyall£¬ÓÐÐËȤµÄÅóÓÑ¿ÉÒÔÈ¥ÕâÀïÁ˽âһϣºhttp://www.importnew.com/16453.html¡£Follower¾ÍÊÇÒ»¸öµÈ´ýleader·¢ËÍinvitation£¬´¦Àí²¢·µ»Ø½á¹ûµÄ¹ý³Ì¡£

Leader.java

Õâôһ¶Î´úÂ룺

ÀïÃæ¾ÍÊÇLeader·¢ËÍÑûÇëinv£¬²¢µÈ´ýfollower·µ»Ø½á¹ûµÄ´ó¸ÅÂß¼­£¬Í¨¹ý¶ÔÏûÏ¢Ìå¼ÓËø£¬ÊÇJava´«Í³µÄʵÏÖ¶àÏ̲߳¢·¢µÄ·½Ê½¡£»¹ÓÐÏû·ÑÕßµÄÏûÏ¢¶ÓÁÐÒ²»á¼ÓËø£¬ÔÚJavaÀÓиö¶ÔÏó½ÐLinkedBlockingQueue£¬ÊDz»ÓüÓËø¾Í¿ÉÒÔputºÍtakeµÄ£¬µ«ÔÚÀý×ÓÀÎÒÃÇÑ¡ÓÃÁ˸ü¼òµ¥µÄLinkedList£¬Ò²ÊÇΪÁ˱íÏÖһϼÓËøµÄÂß¼­¡£

RustµÄʵÏÖ

LeaderµÄ½á¹¹Îª£º

FollowerµÄ½á¹¹Îª£º

¶ÔÓÚÆäËûÓïÑÔת¹ýÀ´µÄͬѧ£¬ÕâÀïµÄVec£¬i32£¬bool¶¼ºÜºÃÀí½â£¬²»¹ýÀïÃæ³öÏÖµÄArcºÍMutex£¬Sender£¬Receiver¾ÍÊÇж«Î÷ÁË£¬ÉÏÃæÕâ4¸ö¶¼ÊÇRust±ê×¼¿âµÄ¶«Î÷£¬Ò²ÊÇÕâ´Î·ÖÏíÒª½éÉܵÄÖØµã¶ÔÏó£¬ÊÇÕâ4¸ö¶«Î÷¹²Í¬ÊµÏÖÁËÏûÏ¢µÄÉú²ú£¬´«µÝºÍÏû·Ñ¡£

ÏÂÃæ¼òµ¥½éÉÜһϷֱðÊÇ×öʲôÓõģº

Arc<T>ʵÏÖÁËsync½Ó¿Ú¡£Sync½Ó¿ÚÊÇ×öÊ²Ã´ÄØ£¿È¨Íþ×ÊÁÏÊÇÕâô˵µÄ£ºµ±Ò»¸öÀàÐÍTʵÏÖÁËSync£¬ËüÏò±àÒëÆ÷±íÃ÷Õâ¸öÀàÐÍÔÚ¶àÏ̲߳¢·¢Ê±Ã»Óе¼ÖÂÄÚ´æ²»°²È«µÄ¿ÉÄÜÐÔ¡£

Èç¹û¿´²»¶®²»Òª½ô£¬ÎÒÃÇÏÈ¿´¿´Êµ¼ÊÖÐÊÇÔõôÓõģº

ÔÚÕâ¸öÀý×ÓÀÎÒÃǹØ×¢Õ⼸¾ä£º

let data = Arc::new(Mutex::new(vec![1u32, 2, 3]));
let data = data.clone();
let mut data = data.lock().unwrap();

ÏÂÃæ·Ö±ð½âÊÍÒ»ÏÂÊÇ×öʲôµÄ£º

¼òµ¥µÄ˵Arc::new±íÃ÷ÁËÕâÊÇͨ¹ýclone()·½·¨À´Ê¹Óõģ¬Ã¿clone£¬¶¼»á¸ø¸Ã¶ÔÏóÔ­×Ó¼ÆÊý+1£¬Í¨¹ýÒýÓüÆÊýµÄ·½·¨À´±£Ö¤¶ÔÏóÖ»Òª»¹±»ÆäÖÐÈκÎÒ»¸öÏß³ÌÒýÓþͲ»»á±»Êͷŵô£¬´Ó¶ø±£Ö¤ÁËÇ°ÃæËµµÄ£ºÕâ¸öÀàÐÍÔÚ¶àÏ̲߳¢·¢Ê±Ã»Óе¼ÖÂÄÚ´æ²»°²È«µÄ¿ÉÄÜÐÔ¡£

Èç¹ûÎÒÃDz»¶¨ÒåΪArc<>¾Í´«µ½ÆäËûÏß³ÌʹÓ㬱àÒëÆ÷»á±¨£º

error: capture of moved value: `data`
data[i] += 1;

ÎÒÃÇ¿ÉÒÔ¼Çסclone()¾ÍÊÇArcµÄÓ÷¨¡£

½ÓÏÂÀ´ÎÒÃÇ¿´Mutex£º

MutexʵÏÖÁËsend½Ó¿Ú¡£Í¬Ñù£¬ÔÚȨÍþ×ÊÁÏÀïÊÇÕâôÃèÊöµÄ£ºÕâ¸öÀàÐ͵ÄËùÓÐȨ¿ÉÒÔÔÚÏ̼߳䰲ȫµÄ×ªÒÆ

ÄÇÎÒÃÇÓÖÊÇÔõôÓÃMutexµÄÄØ£¿¾ÍÊÇÓÃlock().unwrap()¡£lock()µÄ×÷ÓÃÊÇ»ñÈ¡¶ÔÏó£¬Èç¹ûµ±Ç°ÓÐÆäËûÏß³ÌÕýÔÚʹÓÃMutex<T>ÀïÃæµÄT¶ÔÏóʱ£¬±¾Ï߳̾ͻá×èÈû£¬´Ó¶ø±£Ö¤Í¬Ê±Ö»ÓÐÒ»¸öÏß³ÌÀ´·ÃÎʶÔÏó£¬mutexÒ²ÁíÍâÌṩÁËtry_lock()µÄ·½·¨£¬ÊDz»×èÈûµÄ£¬Ö»ÒªÆäËûÏ̱߳»Õ¼Ó㬾ͷµ»Øerr£¬Í¨³£ArcºÍMutex¶¼ÊÇÒ»ÆðʹÓõġ£

»Øµ½ÎÒ×îԭʼµÄÌâÄ¿£¬MutexºÍArcʵÏÖÁ˶ÔÏó±¾ÉíµÄÏ̹߳²Ïí£¬µ«ÊÇÔÚÏ̼߳äÈçºÎ´«µÝÕâ¸ö¶ÔÏóÄØ£¿¾ÍÊÇ¿¿channel£¬channelͨ³£ÊÇÕâô¶¨ÒåµÄlet (tx, rx) = mpsc::channel();Ëü»á·µ»ØÁ½¸ö¶ÔÏótxºÍrx£¬¾ÍÊÇ֮ǰÎÒÌáµ½µÄsenderºÍreceiver¡£

ÔÚÎÒµÄRustʵÏÖÀ¹Ø¼üµÄÓï¾äÊÇÒÔϼ¸¸ö£º

let leaders = (0..leader_cnt).map(|i|
Arc::new(Mutex::new(Leader::new(i,dance_types.len() as i32)))
).collect::<Vec<_>>();

ÕâÒ»¾äÊÇnewÒ»¶Ñleader³öÀ´£¬ArcºÍMutex±íÃ÷leaderÊÇ¿ÉÒÔ¶àÏ̹߳²ÏíºÍ·ÃÎʵġ£

ͬÑùFollowerÒ²ÊÇ£º

let followers = (0..follower_cnt).map(|i|
Arc::new(Mutex::new(Follower::new(i,dance_types.len() as i32,leader_cnt)))
).collect::<Vec<_>>();

½ÓÏÂÀ´Õ⼸¾ä¾ÍÓе㲻ºÃÀí½âÁË¡£

ÕâÀﶨÒåÁËÒ»¶ÑµÄsenderºÍreceiver£¬ÆäÖаÑËûÃǶ¼×÷ΪleaderºÍfollowerµÄ³ÉÔ±±äÁ¿´æÆðÀ´¡£´ó¸ÅÒâ˼¾ÍÊÇÿһ¸öleader¶¼Í¨¹ýsenderÁбí¿ÉÒÔ·¢ËÍinvitation¸øËùÓÐfollower£¬Í¬Ê±ÓÖÓе¥¸öreceiverÀ´½ÓÊÜËùÓÐfollower·¢¸ø×Ô¼ºµÄ´¦Àí½á¹ûinviresult¡£

ͬÑùfollowerÒ²ÊÇÕâô×ö¡£ÕâÑùÔÚÖ®ºóÿһ¸öfollowerºÍleader×÷Ϊһ¸öÏß³ÌÅÜÆðÀ´Ö®ºó£¬¶¼ÄÜÔÚÏ໥֮¼ä½¨Á¢ÁËÒ»ÌõͨÐŵÄͨµÀ¡£

Õâ¸öÊǺÍJavaʵÏÖ¶àÏ̲߳¢·¢×î´óµÄ²»Í¬Ö®´¦£¡JavaÊÇͨ¹ý¸ø¶ÔÏó¼ÓËø£¬RustÊÇͨ¹ýchannel×ªÒÆ¶ÔÏóµÄËùÓÐȨ£¬ÔÚ´úÂëÀleader·¢ËÍinv¸øfolloerÊÇÏÂÃæÕâÒ»¾ä

match self.senders[*follower_id as usize].lock().unwrap().send(inv){£¬ÆäÖеÄlock().unwrap()ÊÇ»ñµÃ¸Ãleader¶Ô¸ÃfollowerµÄ·¢ËÍͨµÀµÄËùÓÐȨ£¬send(inv)¾ÍÊÇ×ªÒÆ¾ßÌåµÄ·¢ËͶÔÏóinvitationËùÓÐȨÁË¡£

Õâ¸ö×ªÒÆ°´ÕÕÎÒµÄÀí½â£¬Ó¦¸ÃÊÇÄڴ濽±´¡£¾ÍÊÇÔÚfollower½ÓÊÕµÄʱºò£¬let inv = match self.receiver.recv() { £¬Ô­À´leaderÀïÃæµÄinvÔÚsendÖ®ºóÒѾ­ÊDz»¿É·ÃÎÊÁË£¬Èç¹ûÄãÖ®ºóÔٴηÃÎÊÁËinv£¬»á±¨use of moved value´íÎ󣬶øfollowerÀïÃæµÄinvÔòÊÇÔÚfollowerµÄÕ»ÀïÐÂÉú³ÉµÄ¶ÔÏó£¬ËùÒÔ£¬ÔÚJavaÀïÃæÎÒÖ»¶¨ÒåÁËinvitation¶ÔÏ󣬵«ÊÇÔÚRustÀïÃæ£¬ÎÒÒªÔÙ¶¨ÒåÒ»¸öInviResult£¬ÒòΪÎÒ¼´Ê¹ÔÚfollowerÏß³ÌÀïÃæÌîÁËresult×ֶΣ¬leaderÏß³ÌÒ²²»ÄܼÌÐø·ÃÎÊinvÁË¡£ËùÒÔÐèÒªÒÀ¿¿followerÔٴη¢ËÍÒ»¸öinvresult¸øleader£¬ËùÒÔÕû¸öRust³ÌÐò´ó¸Å¾ÍÊÇÕâôһ¸ö˼·¡£

ʵ¼ù×ܽá

֮ǰÎÒ²âÊԱȽÏJavaºÍRustʵÏÖµÄÐÔÄÜʱ£¬ÓÉÓÚûÓаѵ÷ÊÔÐÅϢȥµô£¬µ¼ÖÂJava±ÈRustÂýºÜ¶à£¬ÌرðÊÇÄÇЩµ÷ÊÔÐÅÏ¢¶¼Êǵ÷ÓÃString.format£¬ÕâÊDZȼ¸¸östringÏà¼ÓÂýÉÏ10±¶µÄ·½·¨£¬Á½Õß¶¼È¥µôµ÷ÊÔÐÅÏ¢ºó£¬leaderºÍfollower¶¼»á2000µÄʱºò£¬ÔÚÎҵͶËÍâÐÇÈ˱ʼDZ¾ÀÐÔÄܲî±ð´ó¸ÅÊÇ2±¶°É£¬Ã»ÎÒÏëÏóÖдó£¬RustµÄ³ÌÐòÕû¸öдÏÂÀ´±È½Ï·ÑÁ¦£¬Ò»·½ÃæÊǶÔownership»úÖÆ²»Ê죬˼άûÓÐת±ä¹ýÀ´£¬ÁíÒ»·½ÃæRustµÄÈ·ÐèÒª¿ª·¢Õß·Ö²¿·Ö¾«Á¦µ½Ó﷨ϸ½ÚÉÏ¡£

±àÕß×¢£º·ë×ÜÒ²ÓÐһЩÆäËüµÄʵ¼ùÌå»á£¬Çë²Î¼ûCSDN¶Ô·ëÒ«Ã÷µÄר·Ã£¬Çë´ÁÕâÀï¡£Ò²¿ÉÒԲ鿴ËûµÄ¸öÈ˲©¿ÍÀïµÄ×ܽᡣ

ÏÂÃæÕªÂ¼²É·ÃÖйØÓÚRustµÄÄÚÈݹýÀ´£º

Ê×ÏÈRustÀïÃæµÄownershipºÍlifetime¸ÅÄîÕæµÄºÜ¿á£¬¾ÍÒòΪÕâ¸ö¸ÅÄîʵÏÖÎÞÄÚ´æÐ¹Â¶£¬Ò°Ö¸ÕëºÍ°²È«²¢·¢¡£

Æä´Î£¬RustµÄÓï·¨²»¼òµ¥£¬Ò²ÊÇÓв»Éٿӵ쬾Ý˵RustµÄDZÔÚÓû§Ó¦¸ÃÊÇÏÖÔÚµÄCºÍC++³ÌÐòÔ±£¬ËûÃÇ¿ÉÄÜ»á¾õµÃ±È½Ïϰ¹ß£¬Ëµ²»¶¨»¹ ¾õµÃ¸ü¼òµ¥¡£ÓÉÓÚownership»úÖÆ£¬Ò»Ð©ÔÚÆäËûÓïÑÔÄܹ»ÅÜͨµÄ³ÌÐòÔÚRustϾÍÒªµ÷ÕûʵÏÖÁË£¬Ëü»á¸Ä±äÄãд³ÌÐòµÄ˼ά·½Ê½¡£¾Ý˵һЩдRust³¬ ¹ý°ëÄêµÄ³ÌÐòÔ±ÒѾ­°®ÉÏËüÁË£¡

ÎÒ¶ÔRust¸ÐÊܽÏÉîµÄÊÇÏÂÃæ¼¸µã£º

³õѧÕß²»ÊìϤownership»úÖÆ£¬»áÎÞÊý´Î±àÒëʧ°Ü¡£µ«Ò»µ©±àÒë³É¹¦£¬ÄÇô³ÌÐòֻʣÏÂÂß¼­´íÎóÁË¡£Í¬Ñù£¬ÓÉÓÚownership»úÖÆ£¬½«À´ÔÚÏîÄ¿ÀïÐÞ¸ÄRust´úÂ뽫¿ÉÄÜÊÇÍ´¿àµÄ¹ý³Ì£¬ÒòΪԭÀ´±àÒëͨ¹ýµÄ´úÂë¿ÉÄܼÓÈëй¦ÄܾͱàÒë²»¹ýÁË£¬ÕâÊÇÎҵIJ²⡣

Rust±àÒëËÙ¶ÈÂý£¬²»¹ý¾Ý˵×î½üÿһ¸öRustз¢²¼µÄ°æ±¾±àÒëËٶȶ¼±È֮ǰµÄ°æ±¾Ìá¸ßÁË30%¡£

RustûÓÐÀ࣬ÓеÄÊǽṹÌå¼Ó·½·¨£¬ÎÒϲ»¶ÕâÖÖ¼òµ¥µÄ¸ÅÄî¡£

RustûÓÐÀà¼Ì³Ð£¬Ö»Óнӿڣ¬ËäÈ»½Ó¿Ú¿ÉÒÔÌṩĬÈϵÄʵÏÖ¡£ÕâÑùÒ»À´£¬ÔÚ´óÐÍÏîÄ¿ÀïÔ­À´Àà¼Ì³ÐÀ´ÖØÓôúÂëµÄЧ¹ûÊÇ·ñ¾ÍÒªÓóÉÔ±±äÁ¿ÊµÀýÀ´Íê³ÉÄØ£¿

RustûÓÐnull£¬È¡¶ø´úÖ®µÄÊÇNoneºÍOption<T>£¬Ò²Òò´Ë£¬½á¹¹ÌåÔÚ³õʼ»¯µÄʱºò±ØÐë³õʼ»¯ËùÓÐ×ֶΡ£

RustÓÐÎÒÒ»Ö±ºÜÏëÒªµÄ´íÎóÖµ·µ»Ø»úÖÆ£¬¶ø²»±ØÍ¨¹ýÅ×Òì³£»òÕßÐèҪÿÿ¶¨Òå°üº¬½á¹ûºÍ´íÎóÌåʵÏÖ¡£

RustÓÃsendºÍsyncÁ½¸ö½Ó¿ÚÀ´´¦Àí¶àÏ̲߳¢·¢£¬ÆäÖÐArc<T>ºÍMutex<T>·Ö±ðʵÏÖÁËÕâÁ½¸ö½Ó¿Ú£¬¼òµ¥Ò×Óá£

RustĿǰûÓÐÒ»¸öÇ¿´óµÄIDE£¬Ö§³Ö¶Ïµãµ÷ÊÔ£¬±äÁ¿¼à¿ØµÈ¡£

Ëü¸úÏÖÔÚ¶¯Ì¬ÓïÑÔÊÇÁ½¸ö½ØÈ»²»Í¬µÄ·½Ïò£¬ËüÊʺÏһЩ×ÊÉîµÄ³ÌÐòÔ±£¬ÎÒµ¹ÊǾõµÃÓбØÒªÓÐÕâôһ±¾Ê飬½Ð¡¶´ÓC++µ½Rust£¬ÄãÐèÒª¸ÄÉÆµÄ20¸ö±à³Ì ϰ¹ß¡·£¬ÄÜ´Óʵ¼ùÉϸæËß¿ª·¢ÕßRustÀïÎÒÃÇÓ¦¸Ã×ñ´ÓʲôÑùµÄ±à³Ìϰ¹ß¡£RustδÀ´ÊÇ·ñÏñCÄÇÑùÁ÷ÐпªÀ´³ÉΪÐÂÒ»´úµÄÖ÷Á÷ÓïÑÔûÓÐÈËÄܹ»ÖªµÀ£¬µ«Ëü¾ø¶Ô ÊÇÖµµÃÄãÈ¥Á˽âºÍ¹Ø×¢µÄÓïÑÔ¡£

½øÒ»²½µÄ˼¿¼£º·´×ªÁ´±í - JavaºÍRustµÄ²»Í¬ÊµÏÖ

RustµÄlistÓ¦¸ÃÔõô¶¨Ò壬ƩÈ練תÁбíÓÖÊÇÔõô×öÄØ£¿

ÓÉÓÚownershipµÄ»úÖÆºÍ²»´æÔÚ¿ÕÖ¸ÕëµÄÇé¿ö£¬ºÜ¶àÔÚÆäËû´øGCµÄÓïÑÔÄܹ»ÅÜÆðÀ´µÄ³ÌÐòÔÚRustÏÂÃæ¾ÍÒª»»Ò»ÖÖ×ö·¨¡£×î½üÊÔÓÃRustµÄ»ù´¡Êý¾Ý½á¹¹Ê±£¬¸ü¼Ó¼ÓÇ¿ÁËÎҵĿ´·¨¡£ÏÂÃæÒÔ×îԭʼµÄÁ´±ílistΪÀý¡£

ÔÚJavaÖУ¬¿¼ÂÇ×î»ù±¾µÄÁ´±í¶¨Òå

class ListNode {    
int val;
ListNode next;

ListNode(int x) {
val = x;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
sb.append(val);
ListNode pNext = this.next;
while (pNext != null) {
sb.append(",");
sb.append(pNext.val);
pNext = pNext.next;
}
sb.append("]");
return String.format("%s", sb.toString());
}
}

Èç¹ûÎÒÃÇÒª·´×ªÁ´±í£¬¿ÉÒÔÕâô×ö£º

public ListNode reverseList(ListNode head) {    
if (head == null) {
return null;
}
ListNode pNext = head.next;
ListNode pPrevious = null;
while (head != null) {
pNext = head.next;
head.next = pPrevious;
pPrevious = head;
head = pNext;
}
return pPrevious;
}

ÄÇÈç¹ûÎÒÃǰ´ÕÕÒ»°ã˼ά£¬ÔÚRustÀï¶ÔÓ¦µÄʵÏÖ¾ÍÊÇÕâÑù×ӵģº

struct ListNode{  
id :i32,
next :Option<Box<ListNode>>
}

·´×ªÁ´±í£º

fn reverseList2(head :&mut Option<Box<ListNode>>) -> Option<Box<ListNode>> {   
match *head{
None => None,
Some(head) => {
let mut head = Some(head);
let mut pNext = head.unwrap().next;
let mut pPrevious:Option<Box<ListNode>> = None;
while true {
match head {
None =>{break;}
_ =>{}
}
pNext = head.unwrap().next;
head.unwrap().next = pPrevious;
pPrevious = head;
head = pNext;
}
pPrevious
}
}
}

È»ºó±àÒ룬±¨ÁËÒÔÏ´íÎó£º

=¡·match *head{

ERROR£ºcannot move out of borrowed content

=¡· pNext = head.unwrap().next;

ERROR£ºcuse of moved value: `head`

ÕâЩ´íÎó¾ÍÊÇÒòΪRustµÄownership»úÖÆ£¬ÈÃÎÒÃÇÎÞ·¨ÏñJava»òÕßC++Àï±£´æÁÙʱ±äÁ¿£¬ÌرðÊÇÔÚÑ­»·Àï¡£·´¸´ÊÔ¹ý¸÷ÖÖд·¨£¬¶¼Ðв»Í¨¡£

×îºó£¬»»³ÉÕâôÀ´×ö

Á´±í¶¨Ò壺

use List::*;  

enum List {
Cons1(i32, Box<List>),
Nil,
}

// Methods can be attached to an enum
impl List {
#[inline]
fn new() -> List {
Nil
}

#[inline]
fn prepend(self, elem: i32) -> List {
Cons1(elem, Box::new(self))
}

fn len(&self) -> i32 {
match *self {
Cons1(_, ref tail) => 1 + tail.len(),
Nil => 0
}
}

fn stringify(&self) -> String {
match *self {
Cons1(head, ref tail) => {
format!("{}, {}", head, tail.stringify())
},
Nil => {
format!("Nil")
},
}
}
}

fn reverseList(list:List, acc:List ) -> List{
match list{
Cons1(val,tail) => {
reverseList(*tail,acc.prepend(val))
}
Nil => acc
}
}


fn main() {
let mut head = List::new();
let mut i=0;
while i < 10 {
i+=1;
head = head.prepend(i);
}
println!("{:30}",head.stringify());
let result = List::new();
let result = reverseList(head,result);
<span style="white-space:pre"> </span>println!("{:30}",result.stringify());
}

´Ó½á¹û¿ÉÒÔ¿´µ½£¬Á´±íÒѾ­ÊµÏÖ·´×ªÁË¡£ËùÒÔÔÚRustÏÂÃæ£¬ºÜ¶à×ö·¨¶¼Òª»»Ò»Ï¡£ÓÐÈË˵Õâ¾ÍÊÇRustº¯Êýʽ±à³ÌµÄ˼ά¡£ÎÒµ«Ô¸ÕâÖֵݹéʽµÄ×ö·¨²»»áÓÐÒç³ö¡£

   
2556 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ