ব্যাশে ক্লাস বা অবজেক্টগুলি প্রয়োগ করতে আপনার খুব বেশি বাশ কোডের দরকার নেই।
বলুন, 100 লাইন।
বাশের সহকারী অ্যারে রয়েছে যা উত্তরাধিকার, পদ্ধতি এবং বৈশিষ্ট্য সহ একটি সাধারণ অবজেক্ট সিস্টেম প্রয়োগ করতে ব্যবহার করা যেতে পারে।
সুতরাং, আপনি এটির মতো কোনও শ্রেণি সংজ্ঞায়িত করতে পারেন:
class Queue N=10 add=q_add remove=q_remove
এই সারিটির উদাহরণ তৈরি করা এইভাবে করা যেতে পারে:
class Q:Queue N=100
অথবা
inst Q:Queue N=100
যেহেতু ক্লাসগুলি একটি অ্যারের সাথে প্রয়োগ করা হয়, শ্রেণি এবং ইনস্টটগুলি সত্যই প্রতিশব্দ - জাভাস্ক্রিপ্টে এর মতো সাজানো।
এই সারিতে আইটেম যুক্ত করা এইভাবে করা যেতে পারে:
$Q add 1 2 aaa bbb "a string"
ভেরিয়েবল এক্স-এ আইটেমগুলি সরিয়ে ফেলা হতে পারে:
$Q remove X
এবং কোনও বস্তুর ডাম্পিং স্ট্রাকচার এভাবে করা যেতে পারে:
$Q dump
যা এরকম কিছু ফিরে আসবে:
Q {
parent=Queue {
parent=ROOT {
this=ROOT
0=dispatch ROOT
}
class=Queue
N=10
add=q_add
remove=q_remove
0=dispatch Queue
}
class=Q
N=4
add=q_add
remove=q_remove
0=dispatch Q
1=
2=ccc ddd
3=
4=
}
ক্লাসগুলি এই জাতীয় ক্লাস ফাংশন ব্যবহার করে তৈরি করা হয়:
class(){
local _name="$1:" # append a : to handle case of class with no parent
printf "$FUNCNAME: %s\n" $_name
local _this _parent _p _key _val _members
_this=${_name%%:*} # get class name
_parent=${_name#*:} # get parent class name
_parent=${_parent/:/} # remove handy :
declare -g -A $_this # make class storage
[[ -n $_parent ]] && { # copy parent class members into this class
eval _members=\"\${!$_parent[*]}\" # get indices of members
for _key in $_members; do # inherit members from parent
eval _val=\"\${$_parent[$_key]}\" # get parent value
eval $_this[$_key]=\"$_val\" # set this member
done
}
shift 1
# overwrite with specific values for this object
ROOT_set $_this "$@" "0=dispatch $_this" "parent=${_parent:-ROOT}" "class=$_this"
}
দ্রষ্টব্য: একটি নতুন শ্রেণি বা উদাহরণ সংজ্ঞা দেওয়ার সময়, আপনি যে কোনও সদস্যের মান বা ফাংশনকে ওভাররাইড করতে পারেন।
বাশ এসোসিয়েটিভ অ্যারেগুলির একটি ছদ্মবেশ রয়েছে যা এই কাজটি ঝরঝরে করে তোলে: $ Q [0]। $ Q এর সাথে সমান। এর অর্থ হ'ল আমরা কোনও পদ্ধতি প্রেরণের ফাংশনটি কল করতে অ্যারে নামটি ব্যবহার করতে পারি:
dispatch(){
local _this=$1 _method=$2 _fn
shift 2
_fn="$_this[$_method]" # reference to method name
${!_fn} $_this "$@"
}
একটি নীচের দিকটি হ'ল আমি তথ্যের জন্য [0] ব্যবহার করতে পারি না তাই আমার সারিগুলি (এই ক্ষেত্রে) সূচক = 1 থেকে শুরু হয়। বিকল্পভাবে আমি "q + 0" এর মতো সহযোগী সূচকগুলি ব্যবহার করতে পারতাম।
করতে পেতে এবং সেট সদস্যদের আপনি ভালো কিছু করতে পারে:
# basic set and get for key-value members
ROOT_set(){ # $QOBJ set key=value
local _this=$1 _exp _key _val
shift
for _exp in "$@"; do
_key=${_exp%%=*}
_val="${_exp#*=}"
eval $_this[$_key]=\"$_val\"
done
}
ROOT_get(){ # $QOBJ get var=key
local _this=$1 _exp _var _key
shift
for _exp in "$@"; do
_var=${_exp%%=*}
_key=${_exp#*=}
eval $_var=\"\${$_this[$_key]}\"
done
}
এবং ডাম্প একটি বস্তু গঠন, আমি এই তৈরি করেছেন:
দ্রষ্টব্য: ব্যাশে ওওপি-র জন্য এটি প্রয়োজন হয় না তবে কীভাবে অবজেক্ট তৈরি করা হয় তা দেখে ভাল লাগল।
# dump any object
obj_dump(){ # obj_dump <object/class name>
local _this=$1 _j _val _key; local -i _tab=${2:-(${#_this}+2)} # add 2 for " {"
_tab+=2 # hanging indent from {
printf "%s {\n" $_this
eval "_key=\"\${!$_this[*]}\""
for _j in $_key; do # print all members
eval "_val=\"\${$_this[\$_j]}\""
case $_j in
# special treatment for parent
parent) printf "%*s%s=" $_tab "" $_j; ${!_val} dump $(( _tab+${#_j}+${#_val}+2 ));;
*) printf "%*s%s=%s\n" $_tab "" $_j "$_val";;
esac
done
(( _tab-=2 ))
printf "%*s}\n" $_tab ""
return 0
}
আমার ওওপি নকশা বস্তুগুলির মধ্যে অবজেক্টগুলি বিবেচনা করে না - উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণি ব্যতীত। আপনি এগুলি পৃথকভাবে তৈরি করতে বা শ্রেণীর () এর মতো একটি বিশেষ নির্মাতা তৈরি করতে পারেন। অভ্যন্তরীণ ক্লাসগুলি পুনরাবৃত্তভাবে মুদ্রণের জন্য * আপত্তি_ডাম্প * পরিবর্তন করতে হবে।
উহু! এবং আমি ম্যানুয়ালি ক্লাস ফাংশনটি সহজ করার জন্য একটি মূল শ্রেণীর সংজ্ঞা দিই :
declare -gA ROOT=( \
[this]=ROOT \
[0]="dispatch ROOT" \
[dump]=obj_dump \
[set]="ROOT_set" \
[get]="ROOT_get" \
)
কয়েকটি কিউ ফাংশন সহ আমি কিছু ক্লাসের সংজ্ঞা দিয়েছি:
class Queue \
in=0 out=0 N=10 \
dump=obj_dump \
add=q_add \
empty=q_empty \
full=q_full \
peek=q_peek \
remove=q_remove
class RoughQueue:Queue \
N=100 \
shove=q_shove \
head_drop=q_head_drop
কিছু সারি উদাহরণ তৈরি করে এবং সেগুলি কাজ করে:
class Q:Queue N=1000
$Q add aaa bbb "ccc ddd"
$Q peek X
$Q remove X
printf "X=%s\n" "$X"
$Q remove X
printf "X=%s\n" "$X"
$Q remove X
printf "X=%s\n" "$X"
class R:RoughQueue N=3
$R shove aa bb cc dd ee ff gg hh ii jj
$R dump