এটি একটি মজার আলোচনা হয়। আমি মনে করি @ ফ্লোডেলের উদাহরণটি দুর্দান্ত। যাইহোক, আমি মনে করি এটি আমার পয়েন্টটি চিত্রিত করে (এবং @ কোশকে একটি মন্তব্যে এটি উল্লেখ করেছে) return
যখন আপনি কার্যকরী কোডিং শৈলীর পরিবর্তে অপরিহার্য ব্যবহার করেন তখন তা বোধগম্য হয় ।
বিন্দুটি বেলার কথা নয়, তবে আমি এটি আবার লিখে ফেলতাম foo
:
foo = function() ifelse(a,a,b)
একটি কার্যকরী শৈলীর মান সংরক্ষণের মতো, রাষ্ট্রীয় পরিবর্তনগুলি এড়ানো হয় output
। এই শৈলীতে, return
জায়গা বাইরে; foo
আরও গাণিতিক ফাংশনের মতো দেখাচ্ছে।
আমি @ ফ্লোডেলের সাথে একমত: আপনার বুলিয়ান ভেরিয়েবলগুলির একটি জটিল পদ্ধতি ব্যবহার bar
করা কম পরিষ্কার হবে এবং আপনার কাছে থাকা অর্থহীন return
। যে বক্তব্যগুলিকে bar
এতটা সহজলভ্য করে তোলে return
তা হ'ল এটি একটি আবশ্যকীয় স্টাইলে লেখা হয়েছে। প্রকৃতপক্ষে, বুলিয়ান ভেরিয়েবলগুলি কার্যকরী শৈলীতে এড়ানো "রাষ্ট্র" পরিবর্তনগুলি উপস্থাপন করে।
bar
কার্যকরী শৈলীতে পুনর্লিখন করা সত্যিই কঠিন , কারণ এটি কেবল সিউডোকোড, তবে ধারণাটি এরকম কিছু:
e_func <- function() do_stuff
d_func <- function() ifelse(any(sapply(seq(d),e_func)),2,3)
b_func <- function() {
do_stuff
ifelse(c,1,sapply(seq(b),d_func))
}
bar <- function () {
do_stuff
sapply(seq(a),b_func) # Not exactly correct, but illustrates the idea.
}
while
লুপ, সবচেয়ে কঠিন পুনর্লিখন হতে কারণ এটি রাষ্ট্র পরিবর্তন দ্বারা নিয়ন্ত্রিত হয় হবে a
।
একটি কল করার ফলে গতির ক্ষতি return
তুচ্ছ, তবে return
কার্যকরী শৈলীতে এড়ানো এবং পুনরায় লেখার মাধ্যমে অর্জিত দক্ষতা প্রায়শই বিশাল। নতুন ব্যবহারকারীদের ব্যবহার বন্ধ করতে বলা return
সম্ভবত সাহায্য করবে না, তবে তাদেরকে কার্যকরী শৈলীতে পরিচালিত করার অর্থ প্রদান করা হবে।
@ পলটি আবশ্যকীয় return
স্টাইলে প্রয়োজনীয় কারণ আপনি প্রায়শই লুপের বিভিন্ন পয়েন্টে ফাংশনটি থেকে বেরিয়ে আসতে চান। একটি কার্যকরী শৈলী লুপ ব্যবহার করে না, এবং তাই প্রয়োজন হয় না return
। খাঁটি কার্যকরী স্টাইলে চূড়ান্ত কলটি প্রায়শই কাঙ্ক্ষিত রিটার্ন মান হয় is
পাইথনে, ফাংশনগুলির একটি return
বিবৃতি প্রয়োজন । তবে, আপনি যদি একটি ক্রিয়ামূলক শৈলীতে আপনার ফাংশনটিকে প্রোগ্রাম করে থাকেন তবে আপনার ফাংশনটির return
শেষে আপনার কেবলমাত্র একটি বক্তব্য থাকতে পারে।
অন্য স্ট্যাকওভারফ্লো পোস্টের একটি উদাহরণ ব্যবহার করে, আমাদের বলুন যে আমরা ফিরে এসেছি এমন একটি ফাংশন চেয়েছিলাম TRUE
প্রদত্ত সমস্ত মানগুলির মধ্যে x
বিজোড় দৈর্ঘ্য থাকলে । আমরা দুটি স্টাইল ব্যবহার করতে পারি:
# Procedural / Imperative
allOdd = function(x) {
for (i in x) if (length(i) %% 2 == 0) return (FALSE)
return (TRUE)
}
# Functional
allOdd = function(x)
all(length(x) %% 2 == 1)
একটি কার্যকরী শৈলীতে, প্রত্যাবর্তনের মানটি স্বাভাবিকভাবেই ফাংশনের শেষ প্রান্তে পড়ে। আবার এটি আরও গাণিতিক ফাংশনের মতো দেখাচ্ছে।
@ জিএসআই-এ বর্ণিত সতর্কতাগুলি ?ifelse
অবশ্যই আকর্ষণীয়, তবে আমি মনে করি না যে তারা এই ফাংশনটির ব্যবহারকে হ্রাস করার চেষ্টা করছেন। আসলে, ifelse
স্বয়ংক্রিয়ভাবে ভেক্টরাইজিং ফাংশনগুলির সুবিধা রয়েছে। উদাহরণস্বরূপ, এর কিছুটা পরিবর্তিত সংস্করণ বিবেচনা করুন foo
:
foo = function(a) { # Note that it now has an argument
if(a) {
return(a)
} else {
return(b)
}
}
এই ফাংশনটি যখন length(a)
1 হয় ঠিক কাজ করে তবে আপনি যদি foo
একটি দিয়ে পুনরায় লিখেনifelse
foo = function (a) ifelse(a,a,b)
এখন foo
যে কোনও দৈর্ঘ্যের উপর কাজ করে a
। আসলে, এটি এমনকি a
ম্যাট্রিক্স যখন কাজ করবে । test
কোনও বৈশিষ্ট্য যা ভেক্টোরাইজেশনে সহায়তা করে এমন কোনও বৈশিষ্ট্যের মতো একই আকারের প্রত্যাবর্তন , কোনও সমস্যা নয়।
return
এমনকি শেষ উদাহরণে অপ্রয়োজনীয়। অপসারণreturn
এটি আরও দ্রুততর করে তুলতে পারে, তবে আমার মতে এটি হ'ল কারণ বলা হয় যে একটি মজাদার প্রোগ্রামিং ভাষা।