diff --git a/po/fa.po b/po/fa.po index af6be5d9..406545c3 100644 --- a/po/fa.po +++ b/po/fa.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Comprehensive Rust 🦀\n" "POT-Creation-Date: 2024-07-24T09:42:45+03:30\n" -"PO-Revision-Date: 2024-08-07 22:37+0330\n" +"PO-Revision-Date: 2024-09-08 20:39+0330\n" "Last-Translator: alix1383 \n" "Language-Team: Persian\n" "Language: fa\n" @@ -442,7 +442,7 @@ msgstr "تمرین: ROT13" #: src/SUMMARY.md msgid "Day 3: Morning" -msgstr "روز سوم: صبح" +msgstr "روز ۳: صبح" #: src/SUMMARY.md src/running-the-course/course-structure.md:53 #: src/welcome-day-3.md src/memory-management.md @@ -451,7 +451,7 @@ msgstr "مدیریت حافظه" #: src/SUMMARY.md src/memory-management.md src/memory-management/review.md:1 msgid "Review of Program Memory" -msgstr "" +msgstr "بررسی حافظه برنامه" #: src/SUMMARY.md src/memory-management.md #: src/memory-management/approaches.md:1 @@ -468,7 +468,7 @@ msgstr "مفاهیم جابه‌جایی" #: src/SUMMARY.md msgid "`Clone`" -msgstr "" +msgstr "`Clone`" #: src/SUMMARY.md src/memory-management.md #: src/memory-management/copy-types.md:1 @@ -477,7 +477,7 @@ msgstr "کپی کردن تایپ‌ها" #: src/SUMMARY.md msgid "`Drop`" -msgstr "" +msgstr "`Drop`" #: src/SUMMARY.md src/memory-management.md src/memory-management/exercise.md:1 msgid "Exercise: Builder Type" @@ -491,33 +491,32 @@ msgstr "اشاره‌گرهای هوشمند" #: src/SUMMARY.md src/smart-pointers/box.md:1 #: src/android/interoperability/cpp/type-mapping.md:9 msgid "`Box`" -msgstr "" +msgstr "`C، C++ ، " -"پاسکال، ..." +msgstr "کنترل کامل از طریق مدیریت دستی حافظه: C++، C، پاسکال، ..." #: src/memory-management/approaches.md:6 msgid "Programmer decides when to allocate or free heap memory." -msgstr "" +msgstr "برنامه‌نویس تصمیم می‌گیرد که چه زمانی حافظه heap را تخصیص یا آزاد کند." #: src/memory-management/approaches.md:7 msgid "" "Programmer must determine whether a pointer still points to valid memory." msgstr "" +"برنامه‌نویس باید تعیین کند که آیا یک اشاره‌گر هنوز به حافظه معتبر اشاره می‌کند " +"یا نه." #: src/memory-management/approaches.md:8 msgid "Studies show, programmers make mistakes." -msgstr "" +msgstr "مطالعات نشان می‌دهد که برنامه‌نویسان اشتباهاتی مرتکب می‌شوند." #: src/memory-management/approaches.md:9 msgid "" "Full safety via automatic memory management at runtime: Java, Python, Go, " "Haskell, ..." msgstr "" -"ایمنی کامل از طریق مدیریت حافظه خودکار در زمان اجرا: جاوا، پایتون، Go، " -"Haskell، ..." +"ایمنی کامل از طریق مدیریت خودکار حافظه در زمان اجرا: جاوا، پایتون، گو، " +"هسکل، ..." #: src/memory-management/approaches.md:11 msgid "" "A runtime system ensures that memory is not freed until it can no longer be " "referenced." msgstr "" +"یک سیستم زمان اجرا اطمینان می‌یابد که حافظه تا زمانی که دیگر نتواند به آن " +"ارجاع داده شود، آزاد نمی‌شود." #: src/memory-management/approaches.md:13 msgid "" "Typically implemented with reference counting, garbage collection, or RAII." msgstr "" +"معمولاً با استفاده از شمارش ارجاع، جمع‌آوری زباله، یا RAII پیاده‌سازی می‌شود." #: src/memory-management/approaches.md:15 msgid "Rust offers a new mix:" -msgstr "زبان Rust یک ترکیبی از هر را ارائه میدهد:" +msgstr "Rust یک ترکیب جدید ارائه می‌دهد:" #: src/memory-management/approaches.md:17 msgid "" "Full control _and_ safety via compile time enforcement of correct memory " "management." -msgstr "مدیریت کامل و ایمنی حافظه با مدیریت درست حافظه در زمان کامپایل." +msgstr "کنترل کامل و ایمنی از طریق اجرای صحیح مدیریت حافظه در زمان کامپایل." #: src/memory-management/approaches.md:20 msgid "It does this with an explicit ownership concept." -msgstr "این کار رو با کمک مفهوم مالکیت صریح انجام میدهد." +msgstr "این کار را با استفاده از مفهوم مالکیت صریح انجام می‌دهد." #: src/memory-management/approaches.md:25 msgid "" "This slide is intended to help students coming from other languages to put " "Rust in context." msgstr "" +"این اسلاید به منظور کمک به دانش‌آموزانی است که از زبان‌های دیگر می‌آیند تا Rust " +"را در زمینه مناسب قرار دهند." #: src/memory-management/approaches.md:28 msgid "" @@ -7946,6 +7957,10 @@ msgid "" "forgetting to call `free`, calling it multiple times for the same pointer, " "or dereferencing a pointer after the memory it points to has been freed." msgstr "" +"C باید حافظه heap را به‌طور دستی با استفاده از `malloc` و `free` مدیریت کند. " +"خطاهای رایج شامل فراموش کردن فراخوانی `free`، فراخوانی آن چندین بار برای یک " +"اشاره‌گر، یا dereference کردن یک اشاره‌گر پس از آزاد شدن حافظه‌ای است که به آن " +"اشاره می‌کند." #: src/memory-management/approaches.md:32 msgid "" @@ -7954,6 +7969,11 @@ msgid "" "is freed when a function returns. It is still quite easy to mis-use these " "tools and create similar bugs to C." msgstr "" +"++C ابزارهایی مانند اشاره‌گرهای هوشمند (`unique_ptr`, `shared_ptr`) دارد که " +"از تضمین‌های زبانی درباره فراخوانی ویرایشگرها (destructor) برای اطمینان از " +"آزاد شدن حافظه هنگام بازگشت از تابع استفاده می‌کنند. با این حال، هنوز هم " +"بسیار آسان است که از این ابزارها به اشتباه استفاده کرده و باگ‌هایی مشابه به C " +"ایجاد کرد." #: src/memory-management/approaches.md:37 msgid "" @@ -7962,6 +7982,11 @@ msgid "" "be dereferenced, eliminating use-after-free and other classes of bugs. But, " "GC has a runtime cost and is difficult to tune properly." msgstr "" +"جاوا، گو و پایتون به جمع‌آوری‌کننده زباله (garbage collector) برای شناسایی " +"حافظه‌ای که دیگر در دسترس نیست و دور ریختن آن متکی هستند. این امر تضمین می‌کند " +"که هر اشاره‌گری می‌تواند dereference شود و از بروز خطاهای استفاده پس از " +"آزادسازی (use-after-free) و سایر دسته‌های باگ جلوگیری می‌کند. اما، GC هزینه‌ای " +"در زمان اجرا دارد و تنظیم مناسب آن دشوار است." #: src/memory-management/approaches.md:42 msgid "" @@ -7972,28 +7997,36 @@ msgid "" "are even third-party crates available to support runtime garbage collection " "(not covered in this class)." msgstr "" +"مدل مالکیت و قرض‌گیری Rust (ownership and borrowing) می‌تواند در بسیاری از " +"موارد عملکرد C را با عملیات‌های تخصیص و آزادسازی دقیقاً در مکان‌های مورد نیاز " +"-- با هزینه صفر -- به دست آورد. همچنین ابزارهایی مشابه به اشاره‌گرهای هوشمند +" +"+C را فراهم می‌کند. در صورت نیاز، گزینه‌های دیگری مانند شمارش ارجاع نیز در " +"دسترس هستند و حتی crates شخص ثالثی برای پشتیبانی از جمع‌آوری زباله در زمان " +"اجرا موجود است (که در این کلاس پوشش داده نمی‌شود)." #: src/memory-management/ownership.md:3 msgid "" "All variable bindings have a _scope_ where they are valid and it is an error " "to use a variable outside its scope:" msgstr "" -"همه انتساب متغیر دارای یک *اسکوپ* هستند که در آن معتبر هستند و استفاده از یک " -"متغیر خارج از اسکوپ آن خطا است:" +"تمام پیوندهای متغیر دارای یک **دامنه** هستند که در آن معتبر هستند و استفاده " +"از متغیر خارج از دامنه‌اش یک خطاست:" #: src/memory-management/ownership.md:20 -#, fuzzy msgid "" "We say that the variable _owns_ the value. Every Rust value has precisely " "one owner at all times." -msgstr "ما می‌گوییم که متغیر *مالکیت* یک مقدار است." +msgstr "" +"می‌گوییم که متغیر _مالک_ مقدار است. هر مقدار در Rust در هر لحظه دقیقاً یک مالک " +"دارد." #: src/memory-management/ownership.md:23 -#, fuzzy msgid "" "At the end of the scope, the variable is _dropped_ and the data is freed. A " "destructor can run here to free up resources." -msgstr "در پایان اسکوپ، متغیر حذف می‌شود و داده‌ها آزاد می‌شوند." +msgstr "" +"در پایان دامنه، متغیر **حذف** می‌شود و داده‌ها آزاد می‌شوند. یک ویرایشگر " +"(destructor) می‌تواند در اینجا اجرا شود تا منابع را آزاد کند." #: src/memory-management/ownership.md:29 msgid "" @@ -8001,19 +8034,21 @@ msgid "" "garbage collector starts with a set of \"roots\" to find all reachable " "memory. Rust's \"single owner\" principle is a similar idea." msgstr "" +"دانش‌آموزانی که با پیاده‌سازی‌های جمع‌آوری زباله آشنا هستند، خواهند دانست که یک " +"جمع‌آوری‌کننده زباله با مجموعه‌ای از \"ریشه‌ها\" برای یافتن تمام حافظه‌های قابل " +"دسترسی شروع می‌کند. اصول \"مالکیت تک‌گانه\" Rust ایده مشابهی است." #: src/memory-management/move.md:3 msgid "An assignment will transfer _ownership_ between variables:" msgstr "انتساب, *مالکیت* را بین متغیرها منتقل می‌کند:" #: src/memory-management/move.md:7 -#, fuzzy msgid "\"Hello!\"" -msgstr "سلام دنیا" +msgstr "\"سلام!\"" #: src/memory-management/move.md:10 msgid "// println!(\"s1: {s1}\");\n" -msgstr "" +msgstr "// println!(\"s1: {s1}\");\n" #: src/memory-management/move.md:14 msgid "The assignment of `s1` to `s2` transfers ownership." @@ -8071,17 +8106,16 @@ msgstr "" #: src/memory-management/move.md:63 src/memory-management/clone.md:8 msgid "\"Hello {name}\"" -msgstr "" +msgstr "\"سلام {name}\"" #: src/memory-management/move.md:67 src/memory-management/clone.md:12 #: src/android/interoperability/java.md:57 -#, fuzzy msgid "\"Alice\"" -msgstr "برش‌ها" +msgstr "\"الیس\"" #: src/memory-management/move.md:69 msgid "// say_hello(name);\n" -msgstr "" +msgstr "// say_hello(name);\n" #: src/memory-management/move.md:76 msgid "" @@ -8115,7 +8149,7 @@ msgstr "در Rust، کلون‌ها واضح بیان می‌شوند (با اس #: src/memory-management/move.md:87 msgid "In the `say_hello` example:" -msgstr "" +msgstr "در مثال `say_hello`:" #: src/memory-management/move.md:89 msgid "" @@ -8169,11 +8203,11 @@ msgstr "C++ مدرن این مشکل را به شیوه م #: src/memory-management/move.md:107 msgid "\"Cpp\"" -msgstr "" +msgstr "\"Cpp\"" #: src/memory-management/move.md:108 msgid "// Duplicate the data in s1.\n" -msgstr "" +msgstr "// Duplicate the data in s1.\n" #: src/memory-management/move.md:111 msgid "" @@ -8235,30 +8269,40 @@ msgid "" "Sometimes you _want_ to make a copy of a value. The `Clone` trait " "accomplishes this." msgstr "" +"گاهی اوقات شما _می‌خواهید_ یک نسخه از مقدار بسازید. ویژگی `Clone` این کار را " +"انجام می‌دهد." #: src/memory-management/clone.md:21 msgid "" "The idea of `Clone` is to make it easy to spot where heap allocations are " "occurring. Look for `.clone()` and a few others like `vec!` or `Box::new`." msgstr "" +"ایده‌ی `Clone` این است که شناسایی مکان‌های تخصیص حافظه heap آسان‌تر شود. به " +"دنبال `()clone.` و چند مورد دیگر مانند `!vec` یا `Box::new` بگردید." #: src/memory-management/clone.md:24 msgid "" "It's common to \"clone your way out\" of problems with the borrow checker, " "and return later to try to optimize those clones away." msgstr "" +"معمولاً برای حل مشکلات مربوط به بررسی‌کننده قرض‌گیری (borrow checker) از کپی " +"کردن استفاده می‌شود و سپس در آینده تلاش می‌شود تا آن کپی‌ها بهینه‌سازی شوند." #: src/memory-management/clone.md:27 msgid "" "`clone` generally performs a deep copy of the value, meaning that if you e." "g. clone an array, all of the elements of the array are cloned as well." msgstr "" +"`clone` معمولاً یک کپی عمیق از مقدار را انجام می‌دهد، به این معنی که اگر به " +"عنوان مثال یک آرایه را کپی کنید، تمام عناصر آن آرایه نیز کپی خواهند شد." #: src/memory-management/clone.md:30 msgid "" "The behavior for `clone` is user-defined, so it can perform custom cloning " "logic if needed." msgstr "" +"رفتار `clone` توسط کاربر تعریف می‌شود، بنابراین می‌تواند در صورت نیاز، منطق " +"کپی‌برداری سفارشی را اجرا کند." #: src/memory-management/copy-types.md:3 msgid "" @@ -8330,13 +8374,12 @@ msgstr "" "یک نوع `Copy` نیست." #: src/memory-management/copy-types.md:53 -#, fuzzy msgid "" "Remove `Copy` from the `derive` attribute. The compiler error is now in the " "`println!` for `p1`." msgstr "" -"ویژگی `Copy` را از ویژگی‌های `derive` حذف کنید. خطای کامپایلر اکنون در `println!` برای `p1` است." +"ویژگی `Copy` را از صفت `derive` حذف کنید. اکنون خطای کامپایلر در `!println` " +"برای `p1` قرار دارد." #: src/memory-management/copy-types.md:55 msgid "Show that it works if you clone `p1` instead." @@ -8349,69 +8392,82 @@ msgid "" "valid to make a copy of a shared reference, creating a copy of a mutable " "reference would violate Rust's borrowing rules." msgstr "" +"ارجاعات مشترک (`shared references`) دارای ویژگی `Copy`/`Clone` هستند، اما " +"ارجاعات قابل تغییر (`mutable references`) این‌طور نیستند. این به این دلیل است " +"که Rust نیاز دارد که ارجاعات قابل تغییر منحصر به فرد باشند، بنابراین در حالی " +"که کپی کردن یک ارجاع مشترک معتبر است، ایجاد یک کپی از یک ارجاع قابل تغییر " +"قوانین قرض‌گیری Rust را نقض می‌کند." #: src/memory-management/drop.md:1 msgid "The `Drop` Trait" -msgstr "" +msgstr "ویژگی `Drop`" #: src/memory-management/drop.md:3 msgid "" "Values which implement [`Drop`](https://doc.rust-lang.org/std/ops/trait.Drop." "html) can specify code to run when they go out of scope:" msgstr "" +"مقادیر که ویژگی [`Drop`](https://doc.rust-lang.org/std/ops/trait.Drop.html) " +"را پیاده‌سازی می‌کنند می‌توانند کدی را مشخص کنند که هنگام خروج از دامنه اجرا " +"شود:" #: src/memory-management/drop.md:13 msgid "\"Dropping {}\"" -msgstr "" +msgstr "\"Dropping {}\"" #: src/memory-management/drop.md:18 #: src/concurrency/sync-exercises/link-checker.md:85 #: src/concurrency/sync-exercises/solutions.md:121 msgid "\"a\"" -msgstr "" +msgstr "\"a\"" #: src/memory-management/drop.md:20 src/android/testing/googletest.md:12 msgid "\"b\"" -msgstr "" +msgstr "\"a\"" #: src/memory-management/drop.md:22 msgid "\"c\"" -msgstr "" +msgstr "\"a\"" #: src/memory-management/drop.md:23 msgid "\"d\"" -msgstr "" +msgstr "\"a\"" #: src/memory-management/drop.md:24 msgid "\"Exiting block B\"" -msgstr "" +msgstr "\"Exiting block B\"" #: src/memory-management/drop.md:26 msgid "\"Exiting block A\"" -msgstr "" +msgstr "\"Exiting block A\"" #: src/memory-management/drop.md:29 msgid "\"Exiting main\"" -msgstr "" +msgstr "\"Exiting main\"" #: src/memory-management/drop.md:36 msgid "Note that `std::mem::drop` is not the same as `std::ops::Drop::drop`." msgstr "" +"توجه داشته باشید که `std::mem::drop` با `std::ops::Drop::drop` یکسان نیست." #: src/memory-management/drop.md:37 msgid "Values are automatically dropped when they go out of scope." -msgstr "" +msgstr "مقادیر به طور خودکار زمانی که از دامنه خارج می‌شوند، حذف می‌شوند." #: src/memory-management/drop.md:38 msgid "" "When a value is dropped, if it implements `std::ops::Drop` then its `Drop::" "drop` implementation will be called." msgstr "" +"زمانی که یک مقدار حذف می‌شود، اگر آن مقدار ویژگی `std::ops::Drop` را " +"پیاده‌سازی کرده باشد، پیاده‌سازی `Drop::drop` آن فراخوانی خواهد شد." #: src/memory-management/drop.md:40 msgid "" "All its fields will then be dropped too, whether or not it implements `Drop`." msgstr "" +"تمام فیلدهای آن نیز سپس حذف خواهند شد، چه آن مقدار ویژگی `Drop` را پیاده‌سازی " +"کرده باشد یا نه." #: src/memory-management/drop.md:41 msgid "" @@ -8420,26 +8476,35 @@ msgid "" "scope it gets dropped. This makes it a convenient way to explicitly drop " "values earlier than they would otherwise go out of scope." msgstr "" +"`std::mem::drop` یک تابع خالی است که هر مقداری را می‌پذیرد. اهمیت آن در این " +"است که مالکیت مقدار را به عهده می‌گیرد، بنابراین در پایان دامنه‌اش حذف می‌شود. " +"این ویژگی آن را به روشی مناسب برای حذف صریح مقادیر پیش از آنچه که معمولاً از " +"دامنه خارج می‌شوند، تبدیل می‌کند." #: src/memory-management/drop.md:45 msgid "" "This can be useful for objects that do some work on `drop`: releasing locks, " "closing files, etc." msgstr "" +"این می‌تواند برای اشیائی که در هنگام `drop` کاری انجام می‌دهند مفید باشد: آزاد " +"کردن قفل‌ها، بستن فایل‌ها و غیره." #: src/memory-management/drop.md:50 msgid "Why doesn't `Drop::drop` take `self`?" -msgstr "" +msgstr "چرا `Drop::drop` `self` را نمی‌گیرد؟" #: src/memory-management/drop.md:51 msgid "" "Short-answer: If it did, `std::mem::drop` would be called at the end of the " "block, resulting in another call to `Drop::drop`, and a stack overflow!" msgstr "" +"پاسخ کوتاه: اگر این‌طور بود، `std::mem::drop` در پایان بلوک فراخوانی می‌شد که " +"منجر به فراخوانی مجدد `Drop::drop` و ایجاد خطای سرریز (stack overflow) stack " +"می‌شد!" #: src/memory-management/drop.md:53 msgid "Try replacing `drop(a)` with `a.drop()`." -msgstr "" +msgstr "سعی کنید `drop(a)` را با `()a.drop` جایگزین کنید." #: src/memory-management/exercise.md:3 msgid "" @@ -8447,10 +8512,13 @@ msgid "" "data. We will use the \"builder pattern\" to support building a new value " "piece-by-piece, using convenience functions." msgstr "" +"در این مثال، ما یک نوع داده پیچیده را پیاده‌سازی خواهیم کرد که مالک تمام " +"داده‌های خود است. ما از \"الگوی سازنده\" برای پشتیبانی از ساخت یک مقدار جدید " +"به صورت قطعه‌قطعه، با استفاده از توابع کمکی، استفاده خواهیم کرد." #: src/memory-management/exercise.md:7 msgid "Fill in the missing pieces." -msgstr "" +msgstr "جا‌های خالی را پر کنید." #: src/memory-management/exercise.md:22 src/memory-management/solution.md:16 msgid "/// A representation of a software package.\n" @@ -8549,7 +8617,7 @@ msgstr "" #: src/smart-pointers.md msgid "Box" -msgstr "" +msgstr "Box" #: src/smart-pointers.md msgid "Rc" @@ -8560,6 +8628,8 @@ msgid "" "[`Box`](https://doc.rust-lang.org/std/boxed/struct.Box.html) is an owned " "pointer to data on the heap:" msgstr "" +"[`Box`](https://doc.rust-lang.org/std/boxed/struct.Box.html) یک اشاره‌گر مالک " +"به داده‌های روی heap است:" #: src/smart-pointers/box.md:9 msgid "\"five: {}\"" @@ -8571,11 +8641,16 @@ msgid "" "methods from `T` directly on a `Box`](https://doc.rust-lang.org/std/ops/" "trait.Deref.html#more-on-deref-coercion)." msgstr "" +"``." msgstr "" +"پیش‌تر دیدیم که چگونه می‌توان ازویژگی اشیاء (trait objects) با ارجاعات استفاده " +"کرد، مثلاً `dyn Pet&`. با این حال، می‌توانیم از اشیاء ویژگی با اشاره‌گرهای " +"هوشمند مانند `Box` نیز استفاده کنیم تا یک شیء ویژگی مالک (owned trait " +"object) ایجاد کنیم: `` in the example above." msgstr "" +"تایپ‌هایی که ویژگی معین را پیاده‌سازی می‌کنند ممکن است اندازه‌های مختلفی داشته " +"باشند. این موضوع باعث می‌شود که داشتن مواردی مانند ` and fill in the missing " "method:" msgstr "" -"کد زیر را در کپی کرده و " -"توابع را پیاده‌سازی کنید:" +"کد زیر را به کپی کنید و متد‌های ناقص را تکمیل " +"کنید:" #: src/borrowing/exercise.md:45 msgid "" @@ -9167,6 +9385,8 @@ msgid "" "A reference has a _lifetime_, which must not \"outlive\" the value it refers " "to. This is verified by the borrow checker." msgstr "" +"یک مرجع دارای _طول عمر_ است که نباید از ارزش مورد اشاره بیشتر باشد. این " +"موضوع توسط بررسی‌کننده قرض‌ها تایید می‌شود." #: src/lifetimes/lifetime-annotations.md:6 msgid "" @@ -9175,6 +9395,10 @@ msgid "" "`'` and `'a` is a typical default name. Read `&'a Point` as \"a borrowed " "`Point` which is valid for at least the lifetime `a`\"." msgstr "" +"طول عمر می‌تواند ضمنی باشد - این همان چیزی است که تا کنون مشاهده کرده‌ایم. طول " +"عمرها می‌توانند صریح نیز باشند: `&'a Point`، `&'document str`. طول عمرها با " +"`'` شروع می‌شوند و `'a` نام پیش‌فرض معمولی است. `&'a Point` را به عنوان \"یک " +"`Point` قرضی که برای حداقل طول عمر `a` معتبر است\" بخوانید." #: src/lifetimes/lifetime-annotations.md:11 msgid "" @@ -9182,12 +9406,17 @@ msgid "" "yourself. Explicit lifetime annotations create constraints where there is " "ambiguity; the compiler verifies that there is a valid solution." msgstr "" +"طول عمرها همیشه توسط کامپایلر استنتاج می‌شوند: شما نمی‌توانید به طور دستی طول " +"عمر را اختصاص دهید. انتساب‌های صریح طول عمر محدودیت‌هایی ایجاد می‌کنند که در " +"صورت وجود ابهام است؛ کامپایلر تأیید می‌کند که یک راه‌حل معتبر وجود دارد." #: src/lifetimes/lifetime-annotations.md:15 msgid "" "Lifetimes become more complicated when considering passing values to and " "returning values from functions." msgstr "" +"طول عمرها وقتی که به عبور مقادیر به توابع و بازگشت مقادیر از توابع می‌پردازیم " +"پیچیده‌تر می‌شوند." #: src/lifetimes/lifetime-annotations.md:36 msgid "// What is the lifetime of p3?\n" @@ -9205,21 +9434,29 @@ msgid "" "requires explicit annotations of lifetimes on function arguments and return " "values." msgstr "" +"در این مثال، کامپایلر نمی‌داند که طول عمر `p3` را چگونه استنباط کند. نگاه " +"کردن به بدنه تابع نشان می‌دهد که تنها به‌طور ایمن می‌تواند فرض کند که طول عمر " +"`p3` کوتاه‌تر از `p1` و `p2` است. اما مانند تایپ‌ها، راست نیاز به توضیحات صریح " +"طول عمرها در آرگومان‌های تابع و مقادیر بازگشتی دارد." #: src/lifetimes/lifetime-annotations.md:50 msgid "Add `'a` appropriately to `left_most`:" -msgstr "" +msgstr "به تابع `left_most` به صورت مناسب `'a` را اضافه کنید:" #: src/lifetimes/lifetime-annotations.md:56 msgid "" "This says, \"given p1 and p2 which both outlive `'a`, the return value lives " "for at least `'a`." msgstr "" +"این به این معناست که \"با توجه به اینکه `p1` و `p2` هر دو از `'a` بیشتر عمر " +"می‌کنند، مقدار بازگشتی برای مدت `'a` معتبر خواهد بود.\"" #: src/lifetimes/lifetime-annotations.md:59 msgid "" "In common cases, lifetimes can be elided, as described on the next slide." msgstr "" +"در موارد معمول، عمر متغیرها می‌تواند نادیده گرفته شود، همانطور که در اسلاید " +"بعدی توضیح داده شده است." #: src/lifetimes/lifetime-elision.md:1 msgid "Lifetimes in Function Calls" @@ -9232,36 +9469,50 @@ msgid "" "rules](https://doc.rust-lang.org/nomicon/lifetime-elision.html). This is not " "inference -- it is just a syntactic shorthand." msgstr "" +"عمرهای مربوط به آرگومان‌های تابع و مقادیر بازگشتی باید به طور کامل مشخص شوند، " +"اما Rust اجازه می‌دهد عمرها در بیشتر موارد با [چند قانون ساده](https://doc." +"rust-lang.org/nomicon/lifetime-elision.html) نادیده گرفته شوند. این مسئله " +"استنتاج نیست -- بلکه تنها یک اصطلاح نوشتاری کوتاه است." #: src/lifetimes/lifetime-elision.md:8 msgid "Each argument which does not have a lifetime annotation is given one." msgstr "" +"هر آرگومان که فاقد یک lifetime annotation است، یک عمر به آن اختصاص داده " +"می‌شود." #: src/lifetimes/lifetime-elision.md:9 msgid "" "If there is only one argument lifetime, it is given to all un-annotated " "return values." msgstr "" +"اگر تنها یک عمر برای آرگومان وجود داشته باشد، به تمام مقادیر بازگشتی که " +"حاشیه‌نویسی نشده‌اند، اختصاص داده می‌شود." #: src/lifetimes/lifetime-elision.md:11 msgid "" "If there are multiple argument lifetimes, but the first one is for `self`, " "that lifetime is given to all un-annotated return values." msgstr "" +"اگر چندین عمر آرگومان وجود داشته باشد و اولین آن برای `self` باشد، آن عمر به " +"تمام مقادیر بازگشتی که حاشیه‌نویسی نشده‌اند، اختصاص داده می‌شود." #: src/lifetimes/lifetime-elision.md:53 msgid "In this example, `cab_distance` is trivially elided." -msgstr "" +msgstr "در این مثال، `cab_distance` به طور خودکار حذف می‌شود." #: src/lifetimes/lifetime-elision.md:55 msgid "" "The `nearest` function provides another example of a function with multiple " "references in its arguments that requires explicit annotation." msgstr "" +"تابع `nearest` مثال دیگری از تابعی است که با ارجاعات متعدد در آرگومان‌هایش " +"نیاز به حاشیه‌نویسی صریح دارد." #: src/lifetimes/lifetime-elision.md:58 msgid "Try adjusting the signature to \"lie\" about the lifetimes returned:" msgstr "" +"امضا را طوری تنظیم کنید که \"دروغ\" بگوید درباره طول عمر مقادیری که برگشت " +"داده می‌شوند:" #: src/lifetimes/lifetime-elision.md:64 msgid "" @@ -9269,6 +9520,10 @@ msgid "" "validity by the compiler. Note that this is not the case for raw pointers " "(unsafe), and this is a common source of errors with unsafe Rust." msgstr "" +"این کد کامپایل نخواهد شد، که نشان‌دهنده این است که برچسب‌های طول عمر توسط " +"کامپایلر برای اعتبارسنجی بررسی می‌شوند. توجه داشته باشید که این وضعیت برای " +"اشاره‌گرهای خام (ناامن) صدق نمی‌کند و این یکی از منابع رایج خطاها در Rust " +"ناامن است." #: src/lifetimes/lifetime-elision.md:68 msgid "" @@ -9278,6 +9533,12 @@ msgid "" "help resolve ambiguity. Often, especially when prototyping, it's easier to " "just work with owned data by cloning values where necessary." msgstr "" +"دانش‌آموزان ممکن است بپرسند که چه زمانی باید از طول عمرها استفاده کرد. در " +"Rust، _همیشه_ برای قرض‌ها طول عمر وجود دارد. بیشتر مواقع، حذف و استنباط تایپ " +"به این معنی است که نیازی به نوشتن این طول عمرها نیست. در موارد پیچیده‌تر، " +"برچسب‌های طول عمر می‌توانند به حل ابهام کمک کنند. اغلب، به‌ویژه در هنگام " +"پروتوتایپ‌سازی، راحت‌تر است که با داده‌های مالکیت‌شده کار کنید و مقادیر را در " +"صورت لزوم کلون کنید." #: src/lifetimes/struct-lifetimes.md:1 msgid "Lifetimes in Data Structures" @@ -9287,6 +9548,7 @@ msgstr "طول عمر در ساختمان داده" msgid "" "If a data type stores borrowed data, it must be annotated with a lifetime:" msgstr "" +"اگر یک تایپ داده داده‌های قرضی را ذخیره کند، باید با یک طول عمر مشخص شود:" #: src/lifetimes/struct-lifetimes.md:10 msgid "\"Bye {text}!\"" @@ -9314,12 +9576,17 @@ msgid "" "underlying the contained `&str` lives at least as long as any instance of " "`Highlight` that uses that data." msgstr "" +"در مثال بالا، حاشیه‌نویسی بر روی `Highlight` تضمین می‌کند که داده‌های زیرین " +"`str&` به مدت حداقل برابر با هر نمونه از `Highlight` که از آن داده استفاده " +"می‌کند، زنده بماند." #: src/lifetimes/struct-lifetimes.md:29 msgid "" "If `text` is consumed before the end of the lifetime of `fox` (or `dog`), " "the borrow checker throws an error." msgstr "" +"اگر `text` قبل از پایان عمر `fox` (یا `dog`) مصرف شود، بررسی‌کننده‌ی قرض " +"(borrow checker) خطا می‌دهد." #: src/lifetimes/struct-lifetimes.md:31 msgid "" @@ -9327,10 +9594,13 @@ msgid "" "can be useful for creating lightweight views, but it generally makes them " "somewhat harder to use." msgstr "" +"تایپ‌های دارای داده‌های قرضی (borrowed data) کاربران را مجبور می‌کنند تا " +"داده‌های اصلی را نگه دارند. این می‌تواند برای ایجاد نمایه‌های سبک مفید باشد، " +"اما معمولاً استفاده از آنها را تا حدی دشوارتر می‌کند." #: src/lifetimes/struct-lifetimes.md:34 msgid "When possible, make data structures own their data directly." -msgstr "" +msgstr "در صورت امکان، داده‌های ساختارها را به طور مستقیم مالکیت کنید." #: src/lifetimes/struct-lifetimes.md:35 msgid "" @@ -9339,6 +9609,10 @@ msgid "" "relationships between the references themselves, in addition to the lifetime " "of the struct itself. Those are very advanced use cases." msgstr "" +"برخی از ساختارهای داده که شامل چندین ارجاع هستند، ممکن است نیاز به چندین " +"نشانه‌گذاری عمر داشته باشند. این امر می‌تواند ضروری باشد اگر بخواهید روابط " +"عمری بین ارجاعات مختلف را به علاوه عمر ساختار خود توصیف کنید. این موارد " +"بسیار پیشرفته هستند." #: src/lifetimes/exercise.md:3 msgid "" @@ -9347,6 +9621,10 @@ msgid "" "simpler than it seems! This illustrates a common parsing pattern, passing " "slices of data. The underlying data itself is never copied." msgstr "" +"در این تمرین، شما یک تجزیه‌کننده برای [رمزگذاری باینری پروتوباف](https://" +"protobuf.dev/programming-guides/encoding/) خواهید ساخت. نگران نباشید، این " +"کار ساده‌تر از آن است که به نظر می‌رسد! این الگو نشان‌دهنده یک الگوی رایج در " +"تجزیه داده‌ها است که شامل عبور برش‌های داده است. داده‌های اصلی هرگز کپی نمی‌شوند." #: src/lifetimes/exercise.md:8 msgid "" @@ -9355,10 +9633,14 @@ msgid "" "file. In this exercise, we'll encode that information into `match` " "statements in functions that get called for each field." msgstr "" +"تجزیه کامل یک پیام پروتوباف نیاز به دانستن تایپ‌های این فیلدها دارد که بر " +"اساس شماره‌های فیلد ایندکس شده‌اند. این اطلاعات معمولاً در یک فایل `proto` " +"ارائه می‌شود. در این تمرین، ما این اطلاعات را به صورت عبارات `match` در " +"توابعی که برای هر فیلد فراخوانی می‌شوند، کدگذاری خواهیم کرد." #: src/lifetimes/exercise.md:13 msgid "We'll use the following proto:" -msgstr "" +msgstr "ما از پروتوباف زیر استفاده خواهیم کرد:" #: src/lifetimes/exercise.md:28 msgid "" @@ -9367,6 +9649,10 @@ msgid "" "number (e.g., `2` for the `id` field of a `Person` message) and a wire type " "defining how the payload should be determined from the byte stream." msgstr "" +"یک پیام پروتوباف به عنوان مجموعه‌ای از فیلدها، یکی پس از دیگری، کدگذاری " +"می‌شود. هر فیلد به صورت یک \"تگ\" به همراه مقدار آن پیاده‌سازی شده است. تگ " +"شامل شماره فیلد (مانند `2` برای فیلد `id` در پیام `Person`) و wire type است " +"که نحوه تعیین بار را از جریان بایت مشخص می‌کند." #: src/lifetimes/exercise.md:33 msgid "" @@ -9375,12 +9661,18 @@ msgid "" "code also defines callbacks to handle `Person` and `PhoneNumber` fields, and " "to parse a message into a series of calls to those callbacks." msgstr "" +"اعداد، از جمله تگ، با استفاده از کدگذاری با طول متغیر به نام VARINT نمایندگی " +"می‌شوند. خوشبختانه، تابع `parse_varint` برای شما تعریف شده است. کد داده شده " +"همچنین بازخوانی‌هایی برای مدیریت فیلدهای `Person` و `PhoneNumber` و تجزیه یک " +"پیام به مجموعه‌ای از فراخوانی‌ها به آن بازخوانی‌ها را تعریف می‌کند." #: src/lifetimes/exercise.md:38 msgid "" "What remains for you is to implement the `parse_field` function and the " "`ProtoMessage` trait for `Person` and `PhoneNumber`." msgstr "" +"برای شما باقی‌مانده است که تابع `parse_field` و ویژگی `ProtoMessage` را برای " +"`Person` و `PhoneNumber` پیاده‌سازی کنید." #: src/lifetimes/exercise.md:44 src/lifetimes/solution.md:4 msgid "/// A wire type as seen on the wire.\n" @@ -9507,6 +9799,12 @@ msgid "" "enum, but for simplicity in this exercise we panic if any errors are " "encountered. On day 4 we'll cover error handling in Rust in more detail." msgstr "" +"در این تمرین موارد مختلفی وجود دارد که ممکن است تجزیه protobuf با شکست مواجه " +"شود، مثلاً اگر بخواهید یک `i32` را هنگامی که کمتر از ۴ بایت در بافر داده " +"باقی‌مانده است، تجزیه کنید. در کد Rust معمولاً این را با استفاده از `Result` " +"مدیریت می‌کنیم، اما برای سادگی در این تمرین، اگر با هرگونه خطا مواجه شویم، به " +"جای آن که با `Result` برخورد کنیم، برنامه را متوقف خواهیم کرد. در روز چهارم، " +"به بررسی دقیق‌تر مدیریت خطا در Rust خواهیم پرداخت." #: src/lifetimes/solution.md:119 msgid "\"len not a valid `usize`\""